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

前置知识

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

适用范围

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

方法

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

题解

猜你喜欢

转载自www.cnblogs.com/wxyww/p/10099245.html