D1T1 普罗霍洛夫卡
考虑扫描线,那么问题就变成了区间 \(+1\),区间历史异或和问题。
我们先单独考虑一个数的情况,如果在 \(j\) 时刻,\(b_i\) 增加了 \(1\),发现对于后面的所有询问时刻 \(j'\),如果 \(j\) 和 \(j'\) 的奇偶性相同,那么就会产生 \(b_i\oplus (b_i+1)\) 的贡献。
而由于初始 \(b_i=0\),所以我们只需要关注每一次修改的时候,将历史和分成奇数位和偶数位分别存储 \(f_{i,0/1}\) 即可。
我们考虑 \(b_i\oplus (b_i+1)\) 是什么,找到 \(b_i\) 最低的非零位 \(k\),那么就有 \(b_i\oplus (b_i+1)=2^{k+1}-1\)。
相当于要找到某个 \(k\),满足 \(b_i \mod 2^{k+1}=2^k-1\)。
由于每一个数最多进行 \(n\) 次 \(+1\),那么对于某一个阈值 \(k_0\),它修改后取到 \(k>k_0\) 的时刻之后 \(O(\dfrac{n}{2^{k_0}})\) 个,这启发我们阈值分治,取 \(2^{k_0}=O(\sqrt{n})\),也就是大概 256 或者 512。
感觉没有办法使用 \(\operatorname{poly}\log\) 的数据结构维护,所以考虑分块,记块长为 \(B\)。
对于 \(k>k_0\) 的情况,我们对于每个块的数按照 \(\mod 2^k_0\) 的结果开桶暴力维护;
对于 \(k\le k_0\) 的情况,我们对于每一个块维护 \(f_{i,j}\),表示 \(\mod 2^j=i\) 的数的数量,那么每一次修改之后,做出贡献的那 \(k_0\) 的 \(f\) 是可以直接查出来的,单次的复杂度为 \(O(\log n)\)。
对于散块的暴力重构,上面 \(k\le k_0\) 的修改可以通过维护每一个 \(f_{i,j}\) 贡献了多少次来查询,暴力查询每一个数对应到了 \(O(\log n)\) 的位置,暴力重构的复杂度为 \(O(B\log n)\)。
由于 \(k_0\) 是 \(O(\log n)\) 的,所以最终的时间复杂度为 \(O(n\sqrt{n}\log n)\)。
考虑优化。
发现 \(f\) 数组的大小是 \(O(2^{k_0})\) 的,而且他的结构是一个类似线段树结构,例如 \(f_{i,j}=f_{i,j+1}+f_{i+2^j,j+1}\),所以每一种情况对区间 \(f\) 异或和的贡献计算可以 \(O(2^{k_0})\) 预处理出来,做到 \(O(1)\) 查询,而下方贡献也可以用线段树式的结构下方,做到 \(O(2^{k_0})\)。
这样时间复杂度就优化到了 \(O(n\sqrt{n})\)。
D1T2 独立集问题
很神秘的 DP 题,感觉不是很会讲,所以没有写怎么做。
D1T3 回
发现回字形的加法是不好处理的,但是发现它是若干个矩形相加,所以考虑二维差分。发现在二维差分的数组上,操作形如让 \((X-d+1,Y-d+1)\) 到 \((X+d,Y+d)\) 这一条主对角线上的所有点 \(+w\),让 \((X-d+1,Y+d)\) 到 \((X+d,Y-d+1)\) 这一条副对角线上的所有点 \(-w\)。
而对于询问,我们也可以差分成对于 \(x\le X,y\le Y\) 的点 \((x,y)\) 求权值和。
主对角线
我们先考虑主对角线如何求:
发现我们可以再对修改加进行一次差分:对于 \(x-y=X-Y\) 且 \(x> X-d\) 的所有点 \(+w\);对于 \(x-y=X-Y\) 且 \(x> X+d\) 的所有点 \(-w\)。
修改统一为:对于 \(x-y=d\) 且 \(x>x_0\) 的所有点 \(+w\)。
现在我们讨论一个修改 \((d,x_0,w)\) 和询问 \((X,Y)\) 之间作贡献的关系。发现这条射线和询问的关系有两种,第一种是射线先撞到 \(x=X\),第二种是射线先撞到 \(y=Y\)。这两种情况是对称的,我们只讨论其中一种,另一种将所有的 \(x,y\) 反转即可。
首先要有 \(x_0\le X\),同时我们要求先和 \(X\) 轴相交,所以有 \(d\ge X-Y\)。容易得到这一次修改对于询问的贡献为:\(\sum\limits_{i=x_0+1}^Xw(X-i+1)(Y-(i-d)+1)\)。
发现有两个 \(+1\),不好写,所以在下文中用 \(X\) 和 \(Y\) 替换 \(X+1\) 和 \(Y+1\)。
将式子拆开,得到:\(=wX(Y+d)(X-x_0)-w(X+Y+d)\sum\limits_{i=x_0+1}^Xi+w\sum\limits_{i=x_0+1}^Xi^2\)。
将 \(\sum\limits_{i=x_0+1}^Xi\) 和 \(\sum\limits_{i=x_0+1}^Xi^2\) 替换成 \(\dfrac{X(X+1)}{2}-\dfrac{x_0(x_0+1)}{2}\) 和 \(\dfrac{X(X+1)(2X+1)}{6}-\dfrac{x_0(x_0+1)(2x_0+1)}{6}\),同时把式子展开,以 \(d\) 和 \(x_0\) 为主元,可以得到:
\[\text{原式}=w(X^2Y-\dfrac{1}{2}(X+Y)X(X+1)+\dfrac{1}{6}X(X+1)(2X+1))+wx_0(-XY+\dfrac{1}{2}(X+Y)-\dfrac{1}{6})+wd(X^2-\dfrac{1}{2}X(X+1))+wdx_0(-X+\dfrac{1}{2})+wx_0^2(\dfrac{1}{2}(X+Y)-\dfrac{1}{2})+wdx_0^2(\dfrac{1}{2})+wx_0^3(-\dfrac{1}{3}) \]发现和修改有关的只有形如 \(wx_0^id^j\) 其中 \(i,j=0,1,2,3,i+j\le 3\) 的式子。
考虑若干个修改对一次询问,就是对于所有 \(d\ge X-Y\) 且 \(x_0<X\) 的操作,求 \(\sum wx_0^id^j\)。由于还有时间轴,发现这就是朴素的三维数点问题,使用 cdq 分治可以做到 \(O(m\log^2m)\)。
副对角线
发现副对角线是类似的,但是要麻烦一些。
也考虑差分:对于 \(x+y=X+Y+1\) 且 \(y>Y-d\) 的所有点 \(-w\),对于 \(x+y=X+Y+1\) 且 \(y>Y+d\) 的所有点 \(+w\)。
修改变成:对于 \(x+y=d\) 且 \(y>y_0\) 的所有点 \(+w\)。
发现操作和修改有三种关系:
我们考虑红色的贡献:
首先有 \(y_0\le Y\),且 \(d\le X+Y\),因为要求是红色,所以 \(y_0\ge d-X\),那么贡献为 \(\sum\limits_{i=y_0+1}^Yw(X-(d-i)+1)(Y-i+1)\)。
同样将 \(X+1\) 替换成 \(X\),\(Y+1\) 替换成 \(Y\),拆开之后主元:
\[\text{原式}=w(XY^2-\dfrac{1}{2}Y(Y+1)(X-Y)-\dfrac{1}{6}Y(Y+1)(2Y+1))+wy_0(-XY+\dfrac{1}{2}(X-Y)+\dfrac{1}{6})+wd(-Y^2+\dfrac{1}{2}Y(Y+1))+wdy_0(Y-\dfrac{1}{2})+wy_0^2(\dfrac{1}{2}(X-Y)+\dfrac{1}{2})+wdy_0^2(-\dfrac{1}{2})+wy_0^3(\dfrac{1}{3}) \]但是直接处理 \(d-X\le y_0\le Y\) 的限制会导致原题变成四维偏序问题,不好处理。但是由于有 \(d\le X+Y\),即 \(d-X\le Y\),所以满足 \(y_0<d-X\) 的必然满足 \(y_0\le Y\),所以我们用可以做两次二位偏序,用 \(y_0\le Y\) 计算出来的结果减去 \(y_0<d-X\),也就是 \(d-y_0<X\) 计算出来的结果即可。
然后就是橙色的情况,有 \(y_0\le d-X\),且 \(d\le X+Y\),不难证明贡献为 \(\dbinom{X+Y-d+3}{3}\)。
记 \(D=X+Y\),整理可得:\(\text{原式}=w(\dfrac{1}{6}(D+1)(D+2)(D+3))-wd(\dfrac{1}{6}3D^2+12D+11)+wd^2(\dfrac{1}{6}3D+6)-wd^3(\dfrac{1}{6})\),同样可以三位偏序。
最终时间复杂度为 \(O(m\log^2m)\)。
D2T1 燃烧的呐球
考虑使用 Boruvka 算法。
相当于要对于每一个点统计距离他最近的异色点,在接下来维护的所有信息,默认是维护颜色不同的最小的两个值。
发现描述的贡献就是树上子树的对称差,而这个对称差只会有三种形态:\(x_1\) 是 \(x_2\) 的祖先,\(x_2\) 是 \(x_1\) 的祖先,\(x_1\) 和 \(x_2\) 没有祖先后代关系。
而对于没有祖先后代关系的统计,不需要钦定没有祖先后代关系,因为这样松限制是劣的,必然不会是最优解。
接下来对于所有的情况进行讨论:
若 \(x_i\) 是 \(x_j\) 的祖先,也就是 \(x_j\) 在 \(x_i\) 的子树内:
- 若 \(y_i\) 和 \(y_j\) 没有祖先后代关系,可以对于每一个节点维护子树内最小的 \(-siz_{x_j}+siz_{y_j}\),每一个节点将这个信息向父亲合并即可。
- 若 \(y_i\) 是 \(y_j\) 的祖先,考虑使用线段树合并维护,查询 \(y_i\) 对应子树区间内最小的 \(-siz_{x_j}-siz_{y,j}\)。
- 若 \(y_i\) 是 \(y_j\) 的后代,考虑使用线段树合并维护,让 \(y_j\) 对其对应的子树区间都贡献 \(-siz_{x_j}+siz_{y,j}\)。
上面两棵线段树分别要支持:单点修改,区间查询,线段树合并;区间修改,单点查询,线段树合并。
若 \(x_i\) 是 \(x_j\) 的后代,那么也仍然在 dfs 的过程中考虑:
- 若 \(y_i\) 和 \(y_j\) 没有祖先后代关系,对于每一个节点维护祖先内最小的 \(siz_{x_j}+siz_{y_j}\),每一个点的权值从父亲处继承。
- 若 \(y_i\) 是 \(y_j\) 的祖先,查询 \(y_i\) 对应子树区间内最小的 \(-siz_{x_j}-siz_{y,j}\),但是在 dfs 的回溯中需要支持可撤销。
- 若 \(y_i\) 是 \(y_j\) 的后代,让 \(y_j\) 对其对应的子树区间都贡献 \(-siz_{x_j}+siz_{y,j}\),但是在 dfs 的回溯中需要支持可撤销。
上面两棵线段树分别要支持:单点修改,区间查询,可撤销;区间修改,单点查询,可撤销。
若 \(x_i\) 和 \(x_j\) 没有祖先后代关系:
- 若 \(y_i\) 和 \(y_j\) 没有祖先后代关系,甚至不需要上树,直接统计不同颜色的最小的 \(siz_{x_j}+siz_{y_j}\)。
- 若 \(y_i\) 是 \(y_j\) 的祖先,和第一种情况的第一类一致。
- 若 \(y_i\) 是 \(y_j\) 的后代,和第二种情况的第一类一致。
将上面九种情况分别处理出来即可。
时间复杂度 \(O(n\log n+m\log^2n)\)。
D2T2 袜子
半平面小Z的袜子。
将所有的点按照颜色从小到大排序,然后每 \(B\) 个分成一块,由于所有颜色相同的是连续的,所以我们可以利用如下半群信息来维护:第一种颜色及其数量,最后一种颜色及其数量,其他颜色数量的平方和。
那么我们只需要对于每一个块考虑了。
对于块内作旋转扫描线,在整个过程中,点交换相对顺序的次数只有 \(O(B^2)\) 次,将这 \(O(B^2)\) 个交换的时刻和 \(m\) 个询问扔到一起进行极角排序即可。
而旋转扫描线的过程中,对于每一个询问的每一个查询都是查询的前缀的点或者后缀的点,所以可以在每一次交换的之后对 \(O(1)\) 个会变化的前后缀信息就行修改。
时间复杂度为 \(O(\dfrac{n}{B}(B^2\log m+m\log m))\),取 \(B=\sqrt{m}\) 可以做到 \(O(n\sqrt{m}\log m)\) 的复杂度。
D2T3 WBTT
不会。
标签:le,log,修改,siz,对于,CTS2022,dfrac From: https://www.cnblogs.com/Xun-Xiaoyao/p/18366593