珂朵莉树分析
珂朵莉树原理是将整个序列分成若干个块状物,且每个块状物必须要有某种相同的性质如可压缩、可批处理。
区间覆盖
势能分析法
珂朵莉树在区间覆盖操作上并不依赖随机数据,而是具有稳定的上界 O(n)O(n)O(n)(暂时不考虑数据结构对时间复杂度的影响,如果用 setsetset,那么区间覆盖操作会多一个 logloglog)。
以2025年CCPC郑州邀请赛的金牌题C题为例,证明区间覆盖是具有稳定上界 O(n)O(n)O(n)。
给定一个长度为 nnn 的序列和 qqq 次查询,需要维护一个数据结构,每次查询按顺序实现下面两种功能:
- 给定 l,r,dl, r, dl,r,d 将序列区间 [l,r][l,r][l,r] 的值修改为 d,d+1,⋯ ,d+r−ld, d+1, \cdots, d+r-ld,d+1,⋯,d+r−l。
- 查询序列的众数是谁,若有多个数,则返回下标最小的那个。
最开始将区间分成 nnn 份区间,第 iii 区间是以 a[i]a[i]a[i] 为首项,111 为公差的等差数列。
不妨设第 iii 次操作需要修改的区间是 [l,r][l,r][l,r],需要修改的区间数量是 did_idi。
设第 iii 次操作后,系统的势能是 SiS_iSi,SiS_iSi 表示当前区间数量。
现在考虑一次操作对区间数量的影响:
-
一次覆盖操作会遍历 did_idi 个区间并将其合并为一个区间,所以会使区间数量减少 di−1d_i-1di−1,所以贡献是 1−di1-d_i1−di。
-
每次查询总序列众数并不会改变区间数量,所以贡献是 000。
那么,第 i−1i-1i−1 次到第 iii 次操作的势能变化率为:
ΔSi=Si−Si−1=1−di
\Delta S_i=S_i-S_{i-1}=1-d_i
ΔSi=Si−Si−1=1−di
左右两边同时求和可得:
Sq−S0=q−∑i=1qdi
S_q-S_0=q-\sum_{i=1}^{q}d_i
Sq−S0=q−i=1∑qdi
把 ∑i=1qdi\sum_{i=1}^{q}d_i∑i=1qdi 移动到左边:
∑i=1qdi=q+S0−Sq
\sum_{i=1}^{q}d_i=q+S_0-S_q
i=1∑qdi=q+S0−Sq
SqS_qSq 表示最后一次操作区间的数量,S0S_0S0 表示最开始的分块数量 nnn,不难发现,实际上我们操作 qqq 次后需要遍历区间的次数是 O(q+n)O(q+n)O(q+n) 的。
分析出这一点有什么用呢?
我们再维护一个权值线段树,每次将给定的区间 [l,r][l, r][l,r] 中的信息先从权值线段树中删去,直接暴力遍历 [l,r][l,r][l,r] 内的所有区间即可。
然后再将 [l,r][l,r][l,r] 合并为一个区间放入珂朵莉树中。
再对权值线段树中值域为 [d,d+r−l][d,d+r-l][d,d+r−l] 全体加 111 即可。
非覆盖类区间操作或区间查询
除了最核心的功能,珂朵莉树还能给予其他辅助的功能,如查询区间。
但是必须保证,每次查询的区间 [l,r][l,r][l,r] 是随机给出的。
随机给出可以理解为:
- 先随机一个区间长度 lenlenlen。
- 再随机一个区间起点 lll。
每个点被随机为起点的概率是 1n\frac{1}{n}n1。
不妨设 XjX_jXj 表示第 jjj 个区间是否被 [l,r][l,r][l,r] 所触及,设第 jjj 个区间长度为 lenjlen_jlenj
那么一次操作的期望遍历次数是:
E=∑i=1SiP(Xj=1)=∑i=1Silenjn=1
E=\sum_{i=1}^{S_i}P(X_j=1)=\sum_{i=1}^{S_i}\frac{len_j}{n}=1
E=i=1∑SiP(Xj=1)=i=1∑Sinlenj=1
所以每一次操作需要遍历的段数的期望是常数。
放心大胆地遍历就行了。
代码后续补。