CTS2022

D1T1 普罗霍洛夫卡

考虑扫描线,那么问题就变成了区间 +1,区间历史异或和问题。

我们先单独考虑一个数的情况,如果在 j 时刻,bi 增加了 1,发现对于后面的所有询问时刻 j,如果 jj 的奇偶性相同,那么就会产生 bi(bi+1) 的贡献。

而由于初始 bi=0,所以我们只需要关注每一次修改的时候,将历史和分成奇数位和偶数位分别存储 fi,0/1 即可。

我们考虑 bi(bi+1) 是什么,找到 bi 最低的非零位 k,那么就有 bi(bi+1)=2k+11

相当于要找到某个 k,满足 bimod2k+1=2k1

由于每一个数最多进行 n+1,那么对于某一个阈值 k0,它修改后取到 k>k0 的时刻之后 O(n2k0) 个,这启发我们阈值分治,取 2k0=O(n),也就是大概 256 或者 512。

感觉没有办法使用 polylog 的数据结构维护,所以考虑分块,记块长为 B

对于 k>k0 的情况,我们对于每个块的数按照 mod20k 的结果开桶暴力维护;

对于 kk0 的情况,我们对于每一个块维护 fi,j,表示 mod2j=i 的数的数量,那么每一次修改之后,做出贡献的那 k0f 是可以直接查出来的,单次的复杂度为 O(logn)

对于散块的暴力重构,上面 kk0 的修改可以通过维护每一个 fi,j 贡献了多少次来查询,暴力查询每一个数对应到了 O(logn) 的位置,暴力重构的复杂度为 O(Blogn)

由于 k0O(logn) 的,所以最终的时间复杂度为 O(nnlogn)

考虑优化。

发现 f 数组的大小是 O(2k0) 的,而且他的结构是一个类似线段树结构,例如 fi,j=fi,j+1+fi+2j,j+1,所以每一种情况对区间 f 异或和的贡献计算可以 O(2k0) 预处理出来,做到 O(1) 查询,而下方贡献也可以用线段树式的结构下方,做到 O(2k0)

这样时间复杂度就优化到了 O(nn)

D1T2 独立集问题

很神秘的 DP 题,感觉不是很会讲,所以没有写怎么做。

D1T3 回

发现回字形的加法是不好处理的,但是发现它是若干个矩形相加,所以考虑二维差分。发现在二维差分的数组上,操作形如让 (Xd+1,Yd+1)(X+d,Y+d) 这一条主对角线上的所有点 +w,让 (Xd+1,Y+d)(X+d,Yd+1) 这一条副对角线上的所有点 w

而对于询问,我们也可以差分成对于 xX,yY 的点 (x,y) 求权值和。

主对角线

我们先考虑主对角线如何求:

发现我们可以再对修改加进行一次差分:对于 xy=XYx>Xd 的所有点 +w;对于 xy=XYx>X+d 的所有点 w

修改统一为:对于 xy=dx>x0 的所有点 +w

现在我们讨论一个修改 (d,x0,w) 和询问 (X,Y) 之间作贡献的关系。发现这条射线和询问的关系有两种,第一种是射线先撞到 x=X,第二种是射线先撞到 y=Y。这两种情况是对称的,我们只讨论其中一种,另一种将所有的 x,y 反转即可。

首先要有 x0X,同时我们要求先和 X 轴相交,所以有 dXY。容易得到这一次修改对于询问的贡献为:i=x0+1Xw(Xi+1)(Y(id)+1)

发现有两个 +1,不好写,所以在下文中用 XY 替换 X+1Y+1

将式子拆开,得到:=wX(Y+d)(Xx0)w(X+Y+d)i=x0+1Xi+wi=x0+1Xi2

i=x0+1Xii=x0+1Xi2 替换成 X(X+1)2x0(x0+1)2X(X+1)(2X+1)6x0(x0+1)(2x0+1)6,同时把式子展开,以 dx0 为主元,可以得到:

原式=w(X2Y12(X+Y)X(X+1)+16X(X+1)(2X+1))+wx0(XY+12(X+Y)16)+wd(X212X(X+1))+wdx0(X+12)+wx02(12(X+Y)12)+wdx02(12)+wx03(13)

发现和修改有关的只有形如 wx0idj 其中 i,j=0,1,2,3,i+j3 的式子。

考虑若干个修改对一次询问,就是对于所有 dXYx0<X 的操作,求 wx0idj。由于还有时间轴,发现这就是朴素的三维数点问题,使用 cdq 分治可以做到 O(mlog2m)

副对角线

发现副对角线是类似的,但是要麻烦一些。

也考虑差分:对于 x+y=X+Y+1y>Yd 的所有点 w,对于 x+y=X+Y+1y>Y+d 的所有点 +w

修改变成:对于 x+y=dy>y0 的所有点 +w

发现操作和修改有三种关系:

我们考虑红色的贡献:

首先有 y0Y,且 dX+Y,因为要求是红色,所以 y0dX,那么贡献为 i=y0+1Yw(X(di)+1)(Yi+1)

同样将 X+1 替换成 XY+1 替换成 Y,拆开之后主元:

原式=w(XY212Y(Y+1)(XY)16Y(Y+1)(2Y+1))+wy0(XY+12(XY)+16)+wd(Y2+12Y(Y+1))+wdy0(Y12)+wy02(12(XY)+12)+wdy02(12)+wy03(13)

但是直接处理 dXy0Y 的限制会导致原题变成四维偏序问题,不好处理。但是由于有 dX+Y,即 dXY,所以满足 y0<dX 的必然满足 y0Y,所以我们用可以做两次二位偏序,用 y0Y 计算出来的结果减去 y0<dX,也就是 dy0<X 计算出来的结果即可。

然后就是橙色的情况,有 y0dX,且 dX+Y,不难证明贡献为 (X+Yd+33)

D=X+Y,整理可得:原式=w(16(D+1)(D+2)(D+3))wd(163D2+12D+11)+wd2(163D+6)wd3(16),同样可以三位偏序。

最终时间复杂度为 O(mlog2m)

D2T1 燃烧的呐球

考虑使用 Boruvka 算法。

相当于要对于每一个点统计距离他最近的异色点,在接下来维护的所有信息,默认是维护颜色不同的最小的两个值。

发现描述的贡献就是树上子树的对称差,而这个对称差只会有三种形态:x1x2 的祖先,x2x1 的祖先,x1x2 没有祖先后代关系。

而对于没有祖先后代关系的统计,不需要钦定没有祖先后代关系,因为这样松限制是劣的,必然不会是最优解。

接下来对于所有的情况进行讨论:

xixj 的祖先,也就是 xjxi 的子树内:

  1. yiyj 没有祖先后代关系,可以对于每一个节点维护子树内最小的 sizxj+sizyj,每一个节点将这个信息向父亲合并即可。
  2. yiyj 的祖先,考虑使用线段树合并维护,查询 yi 对应子树区间内最小的 sizxjsizy,j
  3. yiyj 的后代,考虑使用线段树合并维护,让 yj 对其对应的子树区间都贡献 sizxj+sizy,j

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

xixj 的后代,那么也仍然在 dfs 的过程中考虑:

  1. yiyj 没有祖先后代关系,对于每一个节点维护祖先内最小的 sizxj+sizyj,每一个点的权值从父亲处继承。
  2. yiyj 的祖先,查询 yi 对应子树区间内最小的 sizxjsizy,j,但是在 dfs 的回溯中需要支持可撤销。
  3. yiyj 的后代,让 yj 对其对应的子树区间都贡献 sizxj+sizy,j,但是在 dfs 的回溯中需要支持可撤销。

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

xixj 没有祖先后代关系:

  1. yiyj 没有祖先后代关系,甚至不需要上树,直接统计不同颜色的最小的 sizxj+sizyj
  2. yiyj 的祖先,和第一种情况的第一类一致。
  3. yiyj 的后代,和第二种情况的第一类一致。

将上面九种情况分别处理出来即可。

时间复杂度 O(nlogn+mlog2n)

D2T2 袜子

半平面小Z的袜子。

将所有的点按照颜色从小到大排序,然后每 B 个分成一块,由于所有颜色相同的是连续的,所以我们可以利用如下半群信息来维护:第一种颜色及其数量,最后一种颜色及其数量,其他颜色数量的平方和。

那么我们只需要对于每一个块考虑了。

对于块内作旋转扫描线,在整个过程中,点交换相对顺序的次数只有 O(B2) 次,将这 O(B2) 个交换的时刻和 m 个询问扔到一起进行极角排序即可。

而旋转扫描线的过程中,对于每一个询问的每一个查询都是查询的前缀的点或者后缀的点,所以可以在每一次交换的之后对 O(1) 个会变化的前后缀信息就行修改。

时间复杂度为 O(nB(B2logm+mlogm)),取 B=m 可以做到 O(nmlogm) 的复杂度。

D2T3 WBTT

不会。

posted @   Xun_Xiaoyao  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
/* 鼠标点击求赞文字特效 */
点击右上角即可分享
微信分享提示