[线段树合并][学习笔记]

前置知识

权值线段树&动态开点线段树

适用范围

有时候我们需要对权值线段树进行合并操作。然后就用到了线段树合并。一般是有很多棵线段树,然后需要将其中的两棵合并起来。

方法

其实方法很简单呢。就是分三种情况讨论一下。假设现在要将线段树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;
}

例题

做完这道例题应该就懂了。
luogu4556
题解

原文地址:https://www.cnblogs.com/wxyww/p/10099245.html