空间 O(n) 的神奇线段树合并

这玩意是真👍,我只能拜谢 gk4000plus

直接说怎么做吧,不然不会引入了🤡👈🤣

做法:在有垃圾回收的基础上,每个点合并时,先将重儿子合并上来,然后再将轻儿子合并上来,最后将这个点上面的操作加进来。(这里的 size 是按操作数计算的)

证明:皎月半洒花:“信息竞赛懂得都懂。”

下面以单点修改距离,区间修改是本质相同的

因为重儿子的值会直接被父亲的值继承上去,所以其实是只有链顶才会临时存储信息,又因为我们是一个 dfsdfs​ 的过程,是每次拎出一条从根节点到叶子的链处理的,所以可以只考虑一条链的所有链顶的大小。

首先根据树剖性质,一条到叶子的链只有 log\log 条轻边,因为走一条轻边 sizesize 就会翻倍,所以不难发现这条链上从上往下数的第 ii 条轻边的子节点的子树大小一定是小于等于 n2i1\frac{n}{2^{i-1} }

![](/img/空间 O(n) 的神奇线段树合并1.png)

上面所说的的拎出一条链就是用红线圈出来的,橙点连向父节点的边是轻边,其中 sz1n211,sz2n221,sz3n231,sz4n241sz_1\le \frac{n}{2^{1-1} },sz_2\le \frac{n}{2^{2-1} },sz_3\le \frac{n}{2^{3-1} },sz_4\le \frac{n}{2^{4-1} }

考虑一颗有 n2x\frac{n}{2^x}​ 个操作的线段树有多少节点,首先前 logn2x\log \frac{n}{2^x}​ 层最坏肯定是可以装满的,前 logn2x\log \frac{n}{2^x}​ 层一共有 2logn2x+12 ^{ \log \frac{n}{2^x}+1}​ 个点,也就是 2×sizeu2\times size_u​ 个点,所以空间是

i=0sum2×sizeu=i=0sum2×n2i=2×n×i=0sum12i=4×n\begin{aligned} &\sum\limits_{i=0}^{sum}2\times size_u \\ =&\sum\limits_{i=0}^{sum}2 \times \frac{n}{2^i} \\ =&2\times n \times\sum\limits_{i=0}^{sum} \frac{1}{2^i} \\ =&4\times n \end{aligned}

注意到我这样算 usizeu\sum\limits_u size_u 的大小是 2×n2\times n 的,所以常数可以直接除以 22 ,空间是 2×n2\times n

的。(这里的 sumsum​ 是橙点数量,uu​ 代表第 i+1i+1​ 个橙点,下同)

然后是剩下的 lognlogn2i\log n- \log \frac{n}{2^i}​ 层,还是一样列一个柿子:

i=0sumsizeu×(lognlogn2i)=i=0sumn2i×log2i=i=0sumn2i×i=j=0sumi=jsumn2i\begin{aligned} &\sum\limits_{i=0}^{sum}size_u\times (\log n- \log \frac{n}{2^i}) \\ =&\sum\limits_{i=0}^{sum} \frac{n}{2^i} \times \log 2^i \\ =&\sum\limits_{i=0}^{sum} \frac{n}{2^i} \times i \\ =&\sum\limits_{j=0}^{sum} \sum\limits_{i=j}^{sum} \frac{n}{2^i} \\ \end{aligned}

首先发现这个柿子的 i=0sumn2i\sum\limits_{i=0}^{sum} \frac{n}{2^i} 是小于 2×n2\times n 的,然后 i=1sumn2i\sum\limits_{i=1}^{sum} \frac{n}{2^i} 是小于 nn 的, i=2sumn2i\sum\limits_{i=2}^{sum} \frac{n}{2^i} 是小于 n2\frac{n}{2} 的,也就每次减少一半,利用的就是 i=0sumn2i2×n\sum\limits_{i=0}^{sum} \frac{n}{2^i} \le 2\times n 的证明,即 n>i=1sumn2in > \sum\limits_{i=1}^{sum} \frac{n}{2^i},所以这个柿子的和是小于 4×n4\times n 的,即我们线段树的空间复杂度应该是 6×n6\times n 的,区间修改应该是 10×n10\times n 的,但是实测很难卡满!


空间 O(n) 的神奇线段树合并
http://lnyxqwq.github.io/2023/08/27/空间 O(n) 的神奇线段树合并/
作者
lnyx
发布于
2023年8月27日
许可协议