线段树合并
顾名思义,线段树合并是把两棵线段树合并到一起的算法。
假如有两棵动态开点的线段树,一棵根节点为 ,另一棵根节点为 。
函数可以将 合并到 上并返回新树的根,流程如下:
- 如果 和 至少有一个为空,返回另一个。
- 如果到了叶子节点,直接合并。
- 令 。
- 令 。
- 返回 。
由于每一个节点至多会被访问一次,所以时间复杂度不会超过两个线段树重叠的部分。
代码实现:
int Merge(int u1, int u2, int l, int r){
if (!u1) return u2;
if (!u2) return u1;
if (l == r){tr[u1].cnt += tr[u2].cnt;return u1;}
int mid = l + r >> 1;
tr[u1].ls = Merge(tr[u1].ls, tr[u2].ls, l, mid);
tr[u1].rs = Merge(tr[u1].rs, tr[u2].rs, mid + 1, r);
pushup(u1);
return u1;
}