zoukankan      html  css  js  c++  java
  • 可持久化瞎扯

    可持久化

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

    以前一直以为区间修改又不能标记永久化的主席树是假的,后来发现是自己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一个劲儿的。

  • 相关阅读:
    程序员面试金典--最大和子矩阵
    hihocoder-[Offer收割]编程练习赛25
    牛客网--今日头条2017后端工程师实习生笔试题
    牛客网-网易2017内推笔试编程题合集(二)
    hihocoder-1565-大富翁
    引用传递和值传递
    SSH详解
    Oracle中的游标
    Oracle触发器-变异表触发器不能访问本表
    Oracle中 in、exists、not in,not exists的比较
  • 原文地址:https://www.cnblogs.com/butterflydew/p/10814726.html
Copyright © 2011-2022 走看看