[模板] 线段树合并

Posted ubospica

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[模板] 线段树合并相关的知识,希望对你有一定的参考价值。

线段树合并

把若干棵叶子节点总数为 \(n\) 的线段树通过某种顺序合并成一棵线段树. 时间复杂度 \(O(n \log n)\).

时间复杂度分析

考虑两颗线段树合并, 复杂度为这两颗线段树的相同节点个数. 这可以看作是删除的节点个数.

那么所有线段树合并, 所有节点最多被删除一次. 时间复杂度即为 \(O(n \log n)\).

线段树合并的空间复杂度也为 \(O(n \log n)\), 而可持久化的线段树合并 (见下) 使用的空间不超过 \(2 \cdot n\log n\).

普通的线段树合并

rt1 变为 rt1rt2 的并.

int merge(int rt1,int rt2)
    if(rt1==0||rt2==0)return rt1+rt2;
    ls(rt1)=merge(ls(rt1),ls(rt2));
    rs(rt1)=merge(rs(rt1),rs(rt2));
    pu(rt1);
    return rt1;

可持久化线段树合并

建立新树为两棵树的并.

int merge(int rt1,int rt2)
    if(rt1==0||rt2==0)return rt1+rt2;
    int rt=++pnd;
    ls(rt)=merge(ls(rt1),ls(rt2));
    rs(rt)=merge(rs(rt1),rs(rt2));
    return rt;

https://wenku.baidu.com/view/88f4e134e518964bcf847c95.html

以上是关于[模板] 线段树合并的主要内容,如果未能解决你的问题,请参考以下文章

T107741 模板权值线段树合并

线段树区间合并POJ3667-Hotel

AtCoder abc256全题解(区间合并模板矩阵快速幂优化dp线段树……)

AtCoder abc256全题解(区间合并模板矩阵快速幂优化dp线段树……)

luoguP4755 Beautiful Pair 笛卡尔树+线段树合并+启发式合并

luoguP4755 Beautiful Pair 笛卡尔树+线段树合并+启发式合并