整体二分求一种 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)\)。

浙公网安备 33010602011771号