可持久化无旋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(
posted @ 2019-12-02 15:56  StaroForgin  阅读(17)  评论(0)    收藏  举报  来源