前置技能:无旋treap
什么是可持久化平衡树?
每经过一次操作,当前状态的整棵树就成为一棵全新版本的树,给每个版本编个号,我们可以根据版本号查找这格版本的树中的一些信息,也可以在这个版本上进行修改生成全新版本。
我们需要保留每个版本的所有信息。
可持久化无旋treap的大体思想
由于treap的树的期望深度为O(logn)级别,所以每次操作(插入/删除等)只涉及O(logn)个节点的修改,对于这些点我们新建
节点以保证不破坏老版本的结构,除了这logn个节点,其其他点沿用老版本的节点,以构成一棵新的树。
我们只需可持久化merge和split函数
可持久化split函数:
图例+讲解:
void split(int rt,int v,int& x,int& y){
if (!rt) x = y = 0;
else {
int now = sz++;
t[now] = t[rt];///直接复制老节点的全部信息