主要是忘了複雜度證明,所以來記一記
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)\)
注意:線段樹合併的複雜度是優於啟發式合併的