可持久化瞎扯

可持久化

  • 不强制在线的可持久化不是可持久化
  • 卡空间的可持久化已经成为历史的大势
  • 以上都是在胡扯

以前一直以为区间修改又不能标记永久化的主席树是假的,后来发现是自己naive

其实很简单,有一个操作

int Copy(int now)
{
    ++tot;
    //copy node now to node tot
    return tot;
}

然后,我们在进入一个新版本的时候,把根对着它基于的历史版本的根赋值一遍,再进行操作。

比如你要进行某区间操作

当你要进入某儿子的时候,把这个儿子赋值一遍接给自己。

当你要pushdown的时候,把左右两个儿子都赋值一遍再接给自己。

所以说,我们保证的其实是当前所在的那个结点一定是当前时刻的新点,这样的话,你怎么玩都没问题了。

注意,在查询的时候也要这样,因为你查询的时候也会pushdown


这样虽然稳,但有可能被卡空间。

所以,一般我们要看一看那个标记可不可以永久化。这样,就少了pushdown时建的点,这个pushdown其实和新儿子的重复点是很多的。

如果还是卡空间,恭喜你,去分块把


平衡树

其实差不多,我只会非旋treap的

空间常数也很大

确保你split和merge的时候的当前节点是新节点就可以了,标记同主席树。

据说split的时候建新节点时,merge就不用建了。但事实上不是所有的split与merge都是对应的,merge的时候不想新建节点你得先考虑考虑。

卡空间:没有标记的时候,可以在平衡树上二分就别split,merge一个劲儿的。

posted @ 2019-05-05 16:59  露迭月  阅读(185)  评论(0编辑  收藏  举报