标签:class merge 左右 pre 持久 版本 有一个 永久 空间
以前一直以为区间修改又不能标记永久化的主席树是假的,后来发现是自己naive
其实很简单,有一个操作
int Copy(int now)
{
++tot;
//copy node now to node tot
return tot;
}
然后,我们在进入一个新版本的时候,把根对着它基于的历史版本的根赋值一遍,再进行操作。
比如你要进行某区间操作
当你要进入某儿子的时候,把这个儿子赋值一遍接给自己。
当你要pushdown的时候,把左右两个儿子都赋值一遍再接给自己。
所以说,我们保证的其实是当前所在的那个结点一定是当前时刻的新点,这样的话,你怎么玩都没问题了。
注意,在查询的时候也要这样,因为你查询的时候也会pusdown
这样虽然稳,但有可能被卡空间。
所以,一般我们要看一看那个标记可不可以永久化。这样,就少了pushdown时建的点,这个pushdown其实和新儿子的重复点是很多的。
如果还是卡空间,恭喜你,去分块把
平衡树
其实差不多,我只会非旋treap的
空间常数也很大
确保你split和merge的时候的当前节点是新节点就可以了,标记同主席树。
据说split的时候建新节点时,merge就不用建了。但事实上不是所有的split与merge都是对应的,merge的时候不想新建节点你得先考虑考虑。
卡空间:没有标记的时候,可以在平衡树上二分就别split,merge一个劲儿的。
标签:class merge 左右 pre 持久 版本 有一个 永久 空间
原文地址:https://www.cnblogs.com/butterflydew/p/10814726.html