「总结」可持久化数据结构
做了一下可持久化数据结构。
总结一下。
1.森林
本身题不难。
但是强制在线就会显得有些恶心。
考虑启发式合并。
用并查集维护联通性和集合大小。
用小的合并入大的。
每次暴力重构主席树和倍增数组。
这样复杂度是\(O(nlog^2n)\)的。
重点在于用启发式合并化解复杂度。
2.影魔
好久以前的题了。
现在才会。
要求两种贡献必须都要被统计。
考虑线段树扫描线。
首先用单调栈维护出左右离这个数最近的大于这个数的数的位置,得到区间\([L_i,R_i]\)
那么有三种贡献:
对于第一种贡献,在扫描到\(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\)维护就行了。