前置知识
适用范围
有时候我们需要对权值线段树进行合并操作。然后就用到了线段树合并。一般是有很多棵线段树,然后需要将其中的两棵合并起来。
方法
其实方法很简单呢。就是分三种情况讨论一下。假设现在要将线段树a和线段树b合并。并且a成为合并之后的线段树。
如果a有当前子树,而b没有,那么返回a的当前子树
如果b有当前字数,而a没有,那么返回b的当前子树
如果现在到了叶子节点,那么就按照题目的要求将叶子节点合并起来。
不要忘记pushup
int merge(int cur,int a,int l,int r) {
if(!cur) return a;
if(!a) return cur;
if(l == r) {
//对叶子节点进行操作
return cur;
}
int mid = (l + r) >> 1;
Ls = merge(Ls,TR[a].ls,l,mid);
Rs = merge(Rs,TR[a].rs,mid + 1,r);
up(cur);
return cur;
}