线段树合并 笔记

主要是忘了复杂度证明,所以来记一记

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

注意:线段树合并的复杂度是优于启发式合并的

posted @ 2024-10-07 09:33  Laijinyi  阅读(5)  评论(0编辑  收藏  举报