CTT2022

D1T1 区间计数

\(S([l,r])\) 表示可重集合 \(\{a_{l},a_{l+1}\dots a_{r}\}\)

考虑统计有哪些区间是重复贡献的,也就是统计所有的区间 \([l,r]\),使得存在区间 \([l',r']\),满足 \(l'<l\)\(S([l',r'])=S([l,r])\)

那先显然有两种情况:\(r'<l\) 以及 \(r'\ge l\)

对于第一种情况,显然 \([l,r]\) 中的每一个数都是 \([l',r']\) 中的数的第二次出现,对于每一个数,维护其前一次出现的时刻 \(b_i\)(如果不存在则构造一些必然使得其不合法的 \(b_i\))。

\(bl(l,r)=\min\limits_{i=l}^rb_i\)\(br(l,r)=\max\limits_{i=l}^rb_i\)。对于所有区间,有 \(br(l,r)-bl(l,r)\ge r-l\);同时对于满足第一种情况的数,显然有 \(br(l,r)-bl(l,r)=r-l\)

\(l\) 从小到大扫描,第 \(r\) 位维护 \(br(l,r)-bl(l,r)-(r-l)\),那么就是查询序列的最小值是多少以及由多少数为最小值。考虑 \(br(l,r)\)\(bl(l,r)\) 可以使用单调栈维护,每一次弹出的时候的修改可以被认为是区间加操作,所以修改操作的总次数是 \(O(n)\) 的。

对于第二种情况,也就是 \(r'\ge l\),由于有 \(S([l',r'])=S([l,r])\),可以得到 \(S([l',l-1])=S([r'+1,r])\),那么此时 \(l-1<r'+1\),这就对应了上面的第一种情况。发现每一个情况一都会对应一个情况二,但是多个情况一可能会对应同一个情况二,所以如何维护。对于所有对应同一个情况二的情况一,它们的 \(r\)\(br(l,r)\) 是相同的。也就是在前面的维护中,每当某一个 \(r\) 位置对第二种情况做出了贡献之后,我们给它打上标记,直到这个位置的 \(br(l,r)\) 变化之后,才让其能够再次可能对答案做出贡献。

但是,这两种情况可能会有重合。通过讨论,发现重合的情况就是 \([l',r']=[2l-r-1,l-1]\) 的情况,也就是要求 \(br(l,r)=l-1\)。满足这个条件的 \(r\) 构成一段区间,位置可以通过在单调栈上二分得到,然后在线段树上进行区间查询即可。

总时间复杂度为 \(O(n\log n)\)

D1T2 一眼丁真

我们考虑进行一定的估计:这个多边形的中心可以被大致认为是所有点的代数均值,然后考察所有点到中心的平均距离,如果是正 \(n\) 多边形,其应该等于 \(\bar{r}_n=\dfrac{\cos(\frac{\pi}{n})\ln(\sec(\frac{pi}{x})+\tan(\frac{pi}{x}))n}{\pi}\)。找到最接近的那个多边形即可。

发现在 \(n\) 较大的时候 \(\bar{r}_n\) 的值比较接近,所以受扰动影响大,只能获得 40 分。

所以考虑使用更精确的算法:最大似然估计

首先我们要了解似然是什么:通过当前发生的事件去估计产生这个结果的可能环境(参数)。对于概率,我们有函数 \(P(x|\theta)\) 表示在 \(\theta\) 条件下发生事件 \(x\) 的概率;而对于似然,我们也有函数 \(\mathcal{L}(\theta|x)\) 表示在事件 \(x\) 发生是,条件为 \(\theta\) 的概率。我们有 \(P(x|\theta)=\mathcal{L}(\theta|x)\),但是这两个函数的自变量是不同的,一个是 \(x\),一个是 \(\theta\)

而最大似然估计就是找到使得 \(\mathcal{L}(\theta|x)\) 最大的 \(\theta\),这也就是最有可能的 \(\theta\)

具体的,我们记 \(\mathcal{L}(X|S)\) 为在正多边形 \(X\) 上通过题目中的生成方式生成出这 \(N\) 个点的集合 \(S\) 的概率密度。我们找到 \(\mathcal{L}(X|S)\) 最大的多边形 \(X\),它的边数 \(n\) 就可以认为是答案。

考虑在题目条件下计算 \(P(S|X)\),也就是正多边形 \(X\) 生成 \(S\) 的概率密度。

由于随机噪声的两维都满足正态分布:\(f(x)=\dfrac{1}{\sqrt{2\pi}\sigma}e^{-\frac{x^2}{2\sigma^2}}\),其中 \(\sigma=0.01\)

那么偏移量为 \((x_0,y_0)\) 的概率密度为 \(\dfrac{1}{\sqrt{2\pi}\sigma}e^{-\frac{x_0^2}{2\sigma^2}}\times \dfrac{1}{\sqrt{2\pi}\sigma}e^{-\frac{y_0^2}{2\sigma^2}}=\dfrac{1}{2\pi\sigma^2}e^{-\frac{x_0^2+y_0^2}{2\sigma^2}}\)

对于一个点 \(p\),它到多边形 \(X\)边界的最短距离为 \(d\),我们就可以近似认为这个点偏移的距离为 \(d\),由于 \(d^2=x_0^2+y_0^2\),那么生成这个点的概率密度就是 \(\dfrac{1}{2\pi\sigma^2}e^{-\frac{d^2}{2\sigma^2}}\)

那么我们可以认为 \(P(S|X)=\prod\limits_{p\in S}\dfrac{1}{2\pi\sigma^2}e^{-\frac{d^2}{2\sigma^2}}\),那么发现 \(\ln(P(S|X))=-|S|\ln(2\pi\sigma^2)-\dfrac{1}{2\sigma^2}\sum\limits_{p\in S}d^2\)。由此可得,比较 \(P(S|X)\) 的大小也就是比较 \(\sum\limits_{p\in S}d^2\) 的大小。

对于每一个可能的边长,需要选取一些可能的多边形 \(X\),然后取出其中最小的。然后找到所有边长中最小的。

首先,对于这个多边形的中心 \(O\),我们可以通过爬山找到 \(\sum\limits_{p\in S}(|\overline{OP}|-1)^2\) 最小的那个点(因为这个结构和 \(\sum\limits_{p\in S}d^2\) 类似)。

然后,我们找到距离 \(O\) 最远的那 \(O(1)\) 个点,这些点最有可能出现在多边形的一个顶角附近。我们通过选取这些点和 \(O\) 连线在单位圆上的交点为起点去构造多边形,然后在去计算 \(\sum\limits_{p\in S}d^2\)

貌似还可以直接爬山,退火或者三分去处理。

D1T3 白兔迷宫

发现带环的期望问题,尝试列出方程高斯消元。先去掉某一些奇奇怪怪的特殊情况,例如以 \(T\) 为入点的边。

\(f_i\) 表示从 \(S\) 走到 \(i\) 点的期望次数(期望分数的零次方,规定 \(0^0=1\)),\(g_i\) 表示从 \(S\) 走到 \(i\) 时的期望分数,\(h_i\) 表示从 \(S\) 走到 \(i\) 时的分数的平方的期望。

\(d_i\) 表示 \(i\) 点的出边数量。有 \(f_v=\sum\limits_{(u,v,o)\in E}\dfrac{1}{d_u}f_u\)\(g_v=\sum\limits_{(u,v,1)\in E}\dfrac{1}{d_u}(g_u+f_u)\)\(h_v=\sum\limits_{(u,v,1)\in E}\dfrac{1}{d_u}(h_u+2g_u+f_u)\)

发现这个一个 \(3n\) 元一次方程组,可以直接高斯消元,时间复杂度 \(O(n^3)\)

D2T1 报复社会

发现所有非叶子节点的颜色是不重要的,因为他必然不会作为最后删除的那个节点。

首先考虑策略,Alice 一定会尽可能地删掉 \(1\),Bob 一定会尽可能地删掉 \(0\)

发现有一档部分分是双层菊花,所以我们先来考虑某一个菊花:当有一个人删掉菊花的根之后,接下来操作的一定可以是 Alice 和 Bob 交替删掉这个菊花里的所有 \(1\)\(0\),直到只剩下一种颜色。

如果剩下的 \(1\),除非没有点可以删,Bob 一定不会去删这些叶子,所以这个点是对 Bob 有利的,同时这个点也是对 Alice 不利的。

考虑如果 Alice 不去主动删掉这个节点,那么由于这个点对于 Bob 有利,他完全可以将其放任不管,如果到最后 Bob 迫不得已删这个节点,说明其他节点已经没有他一定要删的了,所以 Bob 已经建立了优势,这个菊花对于 Bob 来说只会增加优势。所以如果这个菊花,Alice 想要留给 Bob 删,对于 Alice 来说是不优的。那么这个菊花的根对于 Alice 和 Bob 的决策来说是如下的:Alice 会去主动删掉这个节点,但是 Bob 不会。那么发现,这就等价于这个节点的颜色就 \(1\)

总结一下,如果某一个菊花的叶子中 \(1\)\(0\) 多,我们可以把这个节点的颜色变成 \(1\),然后将其的所有儿子变成它的兄弟。\(0\)\(1\) 多的情况同理。

那么现在唯一的特殊情况就是 \(0\)\(1\) 的数量相等。发现在这种情况下,谁删掉这个节点谁不优。由于 \(0\)\(1\) 的数量相同,也就是这个节点的叶子数量必然是偶数,那么谁会删掉这个节点只会和 \(n\) 有关,那么颜色也就确定了。

直接从叶子到根一直处理,时间复杂度 \(O(n)\)

D2T2 赫露艾斯塔

考虑分成两个部分维护,一部分是被扫过的点,一部分是还没有被扫过的点。

对于扫过的点,它们必然分布在一个从左上角到右下角的阶梯上,每一次修改都是将阶梯的某一部分向上或者向右推,是可以用数据结构维护的。同时可以在每一次修改的时候看有没有新的原本没有被扫过的点变成被扫过的点。

现在考虑询问,如果这个询问在阶梯的下方,显然是没有意义的,答案一定为 \(0\)

否则,被扫过过的点中在范围内的必然是一段区间,是容易统计出数量的,而对于没有被扫过的部分,我们考虑容斥,其等于 \(\text{所有未被扫过过的点}-\text{在上方的未被扫过的点}-\text{在右侧的未被扫过的点}+\text{有右上角的未被扫过的点}\),发现第一部分可以直接存储下来,第二部分和第三部分必然是这个范围内的所有未被扫过的点,可以在修改的时候实时维护。对于第四部分,这一部分和阶梯没有交,所以相当于直接询问初始时这个范围有多少个点,可以进行一次离线二维数点来处理。

D2T3 树据结构

由于所有的叶子层数相同,所以每一层的节点数量是单调递增的,而总节点的数量又只有 \(n\) 个,那么本质不同的节点数的数量只有 \(O(\sqrt{n})\) 个。我们考虑对于每一层单独处理。

那么发现,我们要维护的操作就变成了如下的:给出一个矩形,进行矩形加和循环移位的操作。

考虑将矩形加变成二维差分,然后将矩形拼成一行,那么二维差分就变成了先做一次 \(a_i\gets a_{i-1}\),然后做一次 \(a_o\gets a_{i-len}\),其中 \(len\) 是矩形的宽度。那么循环移位就是将数组向后平移一位即可。发现这个所有操作都可以 \(O(1)\) 处理出来,最后 \(O(n+q)\) 求解。

那么最终的时间复杂度即为 \(O((n+q)\sqrt{n})\)

D3T1 澡堂

发现按照 \(t_i\) 排序之后,第 \(i\) 个人可以被认为一定进入 \(i-m\) 进入的澡堂。我们把所有 \(t_i\) 按照 \(\bmod m\) 的余数分开,就可以把问题变成 \(m=1\) 的问题了,所以我们先考虑 \(m=1\) 的情况。

通过将时间偏移,令 \(a_i=t_i-Ti\),使得每一个人洗澡的时间变成 \(0\) 分钟,那么最终答案就是 \(\sum\limits_{i=1}^n\left(\max\limits_{j=1}^ia_j-a_i\right)=\sum\limits_{i=1}^n\max\limits_{j=1}^ia_j-\sum\limits_{i=1}^na_i\)。其中 \(\sum\limits_{i=1}^na_i\) 是容易维护的,现在只需要考虑 \(\sum\limits_{i=1}^n\max\limits_{j=1}^ia_j\),也就是求序列的前缀最大值序列和。

这是一个经典的楼房重建问题,容易使用线段树或者平衡树做到单次 \(O(\log^2n)\)。那么在原题上,发现把 \(t_x\) 修改了之后,对于每一个数所属于的余数会变化。具体地,如果在 \(t_x\) 修改后的值应当插入第 \(x'\) 个数的前面,那么 \(x'\)\(x\) 这一段会有一个循环移位。使用平衡树维护可以做到 \(O((n+qm)\log^2n)\),难以通过。

发现题目中每一个修改是独立的,所以考虑使用一些更快的方法,例如倍增。

对于每一个 \(a_i\),我们维护其后面第一个比它大的数 \(j\),以及 \(a_i\) 对于到 \(a_j\) 之前这一段的贡献 \(a_i(j-i)\)。然后使用倍增数组拓展到 \(2^k\)

那么如果要处理 \(a\) 上一段 \([l,r]\) 的信息,我们只需要直到 \([1,l-1]\) 的最大值 \(X\),就可以通过倍增处理出这一段的前缀最大值之和以及新的最大值 \(X'\)。单词的复杂度是 \(O(\log n)\) 的。

发现将 \(x\) 位的数删除,然后再 \(x'\) 之前加入一个数,每一格澡堂的人都会被分成三段。具体的,对于 \(x'<x\) 的情况,会是 \([1,x')\) 中的 \(r\),接上 \([x',x)\) 中的 \(r-1\),接上 \((x,n]\) 中的 \(r\)。注意到,对于 \(r=0\),在第一段和第二段的衔接处,这两个数减少的 \(Ti\) 是相同的,也就是说,需要对其中的元素进行一个 \(\pm T\) 的偏移,这个是可以直接修改的。\(x<x'\) 的情况同理。

最终时间复杂度 \(O((n+mq)\log n)\)

D3T2 解密游戏

首先找到一个错牌 \(p\),那么久意味着当前序列到最终正确的序列就只差一个置换了。而置换有可以被拆成最多 \(n\) 个交换 \((u,v)\),而一个交换被包含在最终答案的置换中,当且仅当在 \(p\) 上进行了这次交换之后,query 得到的结果会增加。

我们将所有 \(\dfrac{n(n-1)}{2}\) 个交换分成 \(n\) 组,使得每一组的交换互不干扰,然后就可以对其进行分治查找出满足条件的交换,这样询问次数可以做到 \(O(n\log n)\) 的,发现是可以通过的。

最终得到了置换环,但是无法确定置换环的方向,所以需要用一次 query 对每一个置换环确定方向。发现实现出来是完全可以通过的。

D3T3 士兵游戏

考虑对于每一条边,维护会有多少条路径经过它,也就是要求对于每一个数 \(x>1\)\([1,n]\) 中有多少个数在 \(x\) 的子树内。

对于树的构造进行分析之后,得到就是要处理如下问题:已知 \(x\) 的最大质因子为 \(p\),那么就是问 \([1,\left\lfloor\dfrac{n}{x}\right\rfloor]\) 中有多少个数的所有质因子均 \(\le p\)

\(S(i,j)\) 表示 \([1,i]\) 中,有多少个数只含有\(j\) 个质因子。发现所有的选区间都是 \([1,\left\lfloor\dfrac{n}{x}\right\rfloor]\),根据整除分块的经典结论,我们需要关注的 \(i\) 的数量只有 \(O(\sqrt{n})\) 个。

容易得到转移式子 \(S(i,j)=S(i,j-1)+S(\left\lfloor\dfrac{i}{p_j}\right\rfloor,j)\)

那么我们最终要求的就是 \(\sum\limits_{x=2}^nf(S(\left\lfloor\dfrac{n}{x}\right\rfloor,\operatorname{maxp}(x)))\)。其中 \(f(x)=x(n-x)\)\(\operatorname{maxp}(x)\) 表示 \(x\) 的最大质因子是第几大质因子。

考虑枚举 \(d=\left\lfloor\dfrac{n}{x}\right\rfloor\),满足的 \(x\) 在区间 \([l,r]\)

那么答案就变成了 \(\sum\limits_{d}\sum\limits_{i}f(S(d,i))\sum\limits_{x=l}^r[\operatorname{maxp}(x)=i]\)

考虑如何求 \(\sum\limits_{x=l}^r[\operatorname{maxp}(x)=i]\)。记 \(T(i,j)\) 表示 \([1,i]\) 中,有多少个数不含有\(j\) 个质因子。仍然根据整除分块的结论,著需要关注 \(O(\sqrt{n})\)\(i\)

\(T(i,j)\) 有转移式 \(T(i,j)=T(i,j-1)-T(\left\lfloor\dfrac{i}{p_j}\right\rfloor,j-1)\)

那么可以得到 \(\sum\limits_{x=l}^r[\operatorname{maxp}(x)=i]=T(\left\lfloor\dfrac{r}{p_i}\right\rfloor,i-1)-T(\left\lfloor\dfrac{l-1}{p_i}\right\rfloor,i-1)\)

所有 \(\ge \sqrt{n}\) 的质数都可以单独处理。

外层枚举质数 \(p_i\),内层枚举 \(d\),可以做到 \(O(n^{1-\epsilon})\) 的复杂度。发现这个东西和 min25 筛长得很想,所以尝试将其复杂度优化到 \(O(\dfrac{n^{\frac{3}{4}}}{\log n})\)

我们对 \(T(i,j)\) 的含义进行修改:\([1,i]\) 中,有多少个数不含有\(j\) 个质因子或是质数。这样,在从 \(j\) 转移到 \(j+1\) 的时候,只有 \(i\ge p_j^2\) 的部分 \(T(i,j)\) 相较于 \(T(i,j-1)\) 才会有变化,所以只需要转移这一部分,但是转移式会有变化。

观察到求值的时候,除了 \(p_i\) 之外的,所有数都 \(\ge p_i^2\),那么需要的 \(S\) 也只有 \(\le \left\lfloor\dfrac{n}{p_i^2}\right\rfloor\) 的部分。

然后对于那些质数,单独求出那 \(\sqrt{n}\) 个值就可以了,可以使用类似 min25 的那一种搜索。这样复杂度是 \(O(\dfrac{n^{\frac{3}{4}}}{\log n})\)

D4T1 一般路过串串题

我们先拆式子,我们记 \(S[l:r]\)\(T\) 中的出现次数为 \(g(l,r)\)\(S(n)=\sum\limits_{i=1}^nS(i)\)\(S'(n)=\sum\limits_{i=1}^nS(i)\)

\[\begin{aligned} \sum\limits_{(l,r)}f(l,r)(r-l+1)^2&=\sum\limits_{(l,r)}\left(\sum\limits_{(x,y)\subseteq(l,r)}g(x,y)\right)(r-l+1)^2\\ &=\sum\limits_{(x,y)}g(x,y)\sum\limits_{(x,y)\subseteq(l,r)}(r-l+1)^2\\ &=\sum\limits_{(x,y)}g(x,y)\sum\limits_{y\le r\le n}\sum\limits_{0\le l<x}(r-l)^2\\ &=\sum\limits_{(x,y)}g(x,y)\sum\limits_{y\le r\le n}\left(S(r)-S(r-x)\right)\\ &=\sum\limits_{(x,y)}g(x,y)\left(\sum\limits_{y\le r\le n}S(r)-\sum\limits_{y\le r\le n}S(r-x)\right)\\ &=\sum\limits_{(x,y)}g(x,y)\left(S'(n)-S'(y-1)-S'(n-x)+S'(y-x-1)\right) \end{aligned}\]

发现 \(S'(n)\)\(S'(y-1)\)\(S'(n-x)\)\(S'(y-x-1)=S'(len-2)\),都是可以在 SAM 上维护的,时间复杂度 \(O(n|\Sigma|)\)

D4T2 排列

会与 \(b=1\),发现 \(x_2=x_0\oplus f_1(x_1)\)\(x_3=x_1\oplus f_2(x_2)\)\(x_4=x_2\oplus f_3(x_3)\)

所以有 \(x_2=x_0\oplus f_1(x_1)=x_4\oplus f_3(x_3)\),以及 \(f_2(x_2)=x_1\oplus x_3\)

我们随机一对 \(x_0\)\(x_1\) 得到其对应的 \(x_3\)\(x_4\)。然后随机一个数 \(\Delta\)

\(y_0=x_0\oplus \Delta\)\(y_1=x_1\),用其计算 \(y_3,y_4\)。令 \(z_3=x_3\)\(z_4=x_4\oplus \Delta\)

那么不难得到 \(y_2=y_0\oplus f_1(y_1)=x_0\oplus \Delta\oplus f_1(x_1)=x_4\oplus \Delta f_3(x_3)=z_4\oplus f_3(z_3)=z_2\)

那么 \(y_1\oplus y_3=f_2(y_2)=f_2(z_2)=z_1\oplus z_3\)。我们只需要检验 \(y_1\oplus y_3\) 是否等于 \(z_1\oplus z_3\) 即可。

对于 \(b=0\),可以认为是完全随机的,满足上述条件的概率为 \(2^{-64}\),所以可以直接判断即可。

D4T3 欧拉?欧拉!

不会捏🙂。

posted @ 2024-09-30 16:11  Xun_Xiaoyao  阅读(91)  评论(0编辑  收藏  举报
/* 鼠标点击求赞文字特效 */