主要是忘了复杂度证明,所以来记一记
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)\)
注意:线段树合并的复杂度是优于启发式合并的