「总结」可持久化数据结构

做了一下可持久化数据结构。
总结一下。

1.森林
本身题不难。
但是强制在线就会显得有些恶心。
考虑启发式合并。
用并查集维护联通性和集合大小。
用小的合并入大的。
每次暴力重构主席树和倍增数组。
这样复杂度是(O(nlog^2n))的。
重点在于用启发式合并化解复杂度。

2.影魔
好久以前的题了。
现在才会。
要求两种贡献必须都要被统计。
考虑线段树扫描线。
首先用单调栈维护出左右离这个数最近的大于这个数的数的位置,得到区间([L_i,R_i])
那么有三种贡献:

[[L_i,R_i],p1 ]

[L_i和[i+1,R_i-1],p2 ]

[[L_i+1,i-1]和R_i,p2 ]

对于第一种贡献,在扫描到(R_i)的时候加入在(L_i)上。
第二种和第三种都在扫描到定点的时候把贡献加入在区间上。
这样对于一个询问([l_i,r_i])
当扫描到(l_i-1)的时候在线段树上对([l_i,r_i])求和为(res_1),扫描到(r_i)的时候,再次求和为(res_2)
那么答案就是(res2-res1)
重点在于区分统计答案的位置。

3.世博会
这个题能想到我觉得还是挺爽的。
就是切比雪夫距离转化为曼哈顿距离。
我们旋转坐标系变为菱形就可以做了。
转化坐标之后用主席树找到中位数是谁,就可以直接得到答案了。

4.Obserbing the tree树上询问
裸的可持久化树剖。
考虑区间加一个等差数列怎么搞。
对于左侧区间是加入原等差数列,右侧的话只需要改变首项即可,而两个等差数列相加只需要相加首项和公差。
我们这样以来发现要打懒标记,那么用标记永久化实现,如果修改区间是子区间,那么不改变懒标记,只在当前区间加上等差数列的和。
查询的时候将路上的标记全部累加入答案,并且将子区间的改变的和累加入答案即可。
回溯只需要改变基态。
本来早就(AC)了,结果对拍打错了调了半天。

5.Alo
这个题用(set)和可持久化(Trie)来维护。
我们考虑某个次大值可以作为次大值更新答案的区间。
就是这个数的位置-1到左侧第二个大于他的数的位置+1
还有就是这个数的位置+1到右侧第二个大于他的数的位置-1
这样我们先(sort)所有的数,然后将位置加入(set)中,然后从中找到两侧的区间端点,在(Trie)中查询,更新答案即可。
难点在于如何找到答案的统计方法。

6.最大异或和
lyd原题,直接可持久化(Trie)维护就行了。

原文地址:https://www.cnblogs.com/Lrefrain/p/12039865.html