CTS2022

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\) 的子树内:

  1. \(y_i\)\(y_j\) 没有祖先后代关系,可以对于每一个节点维护子树内最小的 \(-siz_{x_j}+siz_{y_j}\),每一个节点将这个信息向父亲合并即可。
  2. \(y_i\)\(y_j\) 的祖先,考虑使用线段树合并维护,查询 \(y_i\) 对应子树区间内最小的 \(-siz_{x_j}-siz_{y,j}\)
  3. \(y_i\)\(y_j\) 的后代,考虑使用线段树合并维护,让 \(y_j\) 对其对应的子树区间都贡献 \(-siz_{x_j}+siz_{y,j}\)

上面两棵线段树分别要支持:单点修改,区间查询,线段树合并;区间修改,单点查询,线段树合并。

\(x_i\)\(x_j\) 的后代,那么也仍然在 dfs 的过程中考虑:

  1. \(y_i\)\(y_j\) 没有祖先后代关系,对于每一个节点维护祖先内最小的 \(siz_{x_j}+siz_{y_j}\),每一个点的权值从父亲处继承。
  2. \(y_i\)\(y_j\) 的祖先,查询 \(y_i\) 对应子树区间内最小的 \(-siz_{x_j}-siz_{y,j}\),但是在 dfs 的回溯中需要支持可撤销。
  3. \(y_i\)\(y_j\) 的后代,让 \(y_j\) 对其对应的子树区间都贡献 \(-siz_{x_j}+siz_{y,j}\),但是在 dfs 的回溯中需要支持可撤销。

上面两棵线段树分别要支持:单点修改,区间查询,可撤销;区间修改,单点查询,可撤销。

\(x_i\)\(x_j\) 没有祖先后代关系:

  1. \(y_i\)\(y_j\) 没有祖先后代关系,甚至不需要上树,直接统计不同颜色的最小的 \(siz_{x_j}+siz_{y_j}\)
  2. \(y_i\)\(y_j\) 的祖先,和第一种情况的第一类一致。
  3. \(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

不会。

posted @ 2024-08-20 14:13  Xun_Xiaoyao  阅读(5)  评论(0编辑  收藏  举报
/* 鼠标点击求赞文字特效 */