线段树合并 笔记
主要是忘了复杂度证明,所以来记一记
int merge(int u, int v, int l, int r) {
if (!u || !v) return u | v;
if (l == r) return a[u].sum += a[v].sum, u;
a[u].lc = merge(a[u].lc, a[v].lc, l, mid);
a[u].rc = merge(a[u].rc, a[v].rc, mid + 1, r);
up(u);
return u;
}
复杂度:
首先总点数 \(O(n\log n)\)
- 当两棵树都有该区间时,合并会使得点总数减 1
- 当只有一颗树有该区间时,合并会停止
所以合并的复杂度和总点数同量级,属于 \(O(n\log n)\)
注意:线段树合并的复杂度是优于启发式合并的