前言
话说天下之树,分久必合,合久必分
合并
所谓合并,就是把两个树合并
以把B树合并到A树为例
如果A没有该节点,改成B的该节点返回
如果B没有该节点,直接返回
否则递归合并子树,最后更新答案即可
特殊的,如果到了叶子,就把A的答案加上B的答案
代码
void merge(int &a,int b,int l,int r){
if(!a){
a=b;return;
}
if(!b) return;
if(l==r){
tr[a].siz+=tr[b].siz;return;
}
merge(tr[a].ls,tr[b].ls,l,mid);
merge(tr[a].rs,tr[b].rs,mid+1,r);
pushup(a);
}
分裂
所谓分裂,就是把一棵树分裂
举例:把A树的[x,y]拆下来,形成B
类似线段树区间查询的方法
代码
void split(int a,int &b,int l,int r,int x,int y){
b=New();
if(!a) return;
if(x<=l&&r<=y){
swap(tr[a],tr[b]);
return;
}
if(x<=mid) split(tr[a].ls,tr[b].ls,l,mid,x,y);
if(y>mid) split(tr[a].rs,tr[b].rs,mid+1,r,x,y);
pushup(a);pushup(b);
}