可持久化无旋Treap学习
可持久化无旋Treap
今天又学习了可持久化非旋Treap,其实很简单,将普通的非旋Treap持久化一遍就行了。具体来说,就是将每次操作后得到的树记录下来,每次需要改变一个点的信息时,将原有的点的信息记录下来,建一个新点去更改它的信息。
其实持久化的过程与线段树的持久化相似。
其实打出来跟普通的非旋Treap差不多,加几个改点的步骤即可。
非旋Treap学习见此处:非旋Treap学习
模板
下面是模板。其实与非旋Treap差不多,可以跳过。
分裂
void split(int now,int k,int &x,int &y){
if(!now){
x=y=0;
return ;
}
if(k<val[now]){
y=++tot;newpoint(y,now);
split(son[y][0],k,x,son[y][0]);
updata(y);
}
else{
x=++tot;newpoint(x,now);
split(son[x][1],k,son[x][1],y);
updata(x);
}
}
合并
int merge(int a,int b){
if(!a||!b) return a+b;
if(rnd[a]>rnd[b]){
int p=++tot;newpoint(p,a);
son[p][1]=merge(

浙公网安备 33010602011771号