線段樹合併 筆記

Laijinyi發表於2024-10-07

主要是忘了複雜度證明,所以來記一記

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)\)

注意:線段樹合併的複雜度是優於啟發式合併的

相關文章