【算法】线段树合并

现在有两棵线段树,我们的目标是将它们的信息合并成一棵。对于一般的线段树直接遍历然后对应结点合并即可,时间复杂度 \(O(n)\),那对于动态开点线段树呢?假设我们希望把线段树 \(B\) 的信息合并到 \(A\) 里面,那么从 \(A\) 的根开始遍历,遍历范围是 \(A\)\(B\) 对应位置结点的并。

设当前遍历到 \(u\)\(u\) 为区间 \([L,R]\) 对应结点。

  • \(u\)\(A\) 中有但在 \(B\) 中没有,则返回。

  • \(u\)\(B\) 中有但在 \(A\) 中没有,则将 \(B\)\(u\) 子树接到 \(A\) 的对应位置上。

  • \(u\)\(A,B\) 中都没有,则返回。

  • \(u\) 为叶子,则将 \(B_u\) 的信息并入 \(A_u\)

  • 否则,继续遍历。

上述过程主要方便理解,实现可以做到更加简洁。

\(n\) 为元素个数,\(V\) 为值域,合并过程中总共会合并(或者说插入) \(O(n)\) 个点,单次操作复杂度为 \(O(\log V)\),故这样操作合并若干个线段树的总复杂度为 \(O(n \log V)\)

posted @ 2026-04-22 23:33  yutar  阅读(19)  评论(0)    收藏  举报