文章目录
- 前言
- 合并
- 代码
- 分裂
- 代码
前言
话说天下之树,分久必合,合久必分
合并
所谓合并,就是把两个树合并
以把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);
}