码迷,mamicode.com
首页 > 其他好文 > 详细

可持久化瞎扯

时间:2019-05-05 17:17:43      阅读:124      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!