Loading

整体二分求一种 MST

问题

给定 \(n\)\(m\) 边的无向图,边权形如二元组 \((x,y)\)

一棵生成树的权值是它的边的 \(\max x+\max y\)

求最小生成树。

离散化,\(x,y\) 范围 \(O(m)\)

\(a_i\)\(\max x\le i\) 时,\(\max y\) 的最小值。

显然 \(a\) 单调不升。考虑在 \(x\) 维上做整体二分。

整体二分

\(\mathrm{divide}(l,r,L,R)\),处理 \(\max x\)\([l,r]\) 中,\(a\) 值在 \([L,R]\) 中的情况。

类似决策单调性的分治,整出 \(a_{mid}\),左半边 \(a\)\(\ge a_{mid}\),右半边 \(a\)\(\le a_{mid}\),对 \(a\) 值有个限制。

并查集维护连通情况,分治 \([l,r,L,R]\) 时,并查集内要已经有 \(x<l,y\le L\) 的边。

Part 1

枚举 \(x\)\([l,mid]\) 内的边 \(u\lrarr v\)(按 \(y\) 从小到大枚举)。

  • \(y\le L\),并查集连 \(u,v\)
  • \(y>L\),忽略。

Part 2

然后并查集有可能还没连通,需要加一些 \(y\) 更大的边。

枚举 \(y\)\([L,R]\) 内的边 \(u\lrarr v\)(按 \(y\) 从小到大枚举)。

  • \(x\le mid\),并查集连 \(u,v\),并查集连通整个图时,\(a_{mid}=y\)
  • \(x>mid\),忽略。

边的处理

左边 \(L'=a_{mid},R'=R\),右边 \(L'=L,R'=a_{mid}\)

需要把 \(l\le x\le mid,y\le L'\) 的边存进并查集内,再递归右边。

撤销掉 Part 2 的边,递归右边 \(\mathrm{divide}(mid+1,r,L,a_{mid})\)

需要把 \(x<l,L\le y\le L'\) 的边存进并查集内,再递归左边。

撤销掉 Part 1 的边,加入 \(x<l,L\le y\le a_{mid}\) 的边。

递归左边 \(\mathrm{divide}(l,mid-1,a_{mid},R)\)

复杂度

需要可撤销并查集,时间复杂度 \(O(m\log^2 m)\)

同时在撤销栈内的边是 \(O(m)\) 的,空间复杂度 \(O(m)\)

posted @ 2025-04-30 20:42  Mathew_Miao  阅读(16)  评论(0)    收藏  举报