平面上給定若干點。若兩點在水平或垂直方向相鄰(曼哈頓距離 = 1),則屬同一區域(連通分量)。求最大的 K 個區域的點數之和。K 不超過區域總數。
parent[i]=i,size[i]=1。size[root](或直接用根節點的 size)。struct DSU { vector<int> p, sz; DSU(int n): p(n), sz(n,1) { iota(p.begin(), p.end(), 0); } int find(int x) { return p[x]==x?x:p[x]=find(p[x]); } void unite(int a, int b) { a=find(a); b=find(b); if(a==b) return; if(sz[a]複雜度
- 排序 O(N log N)
- 並查集操作 O(N α(N)) ≈ O(N)
- 總時間 O(N log N),空間 O(N)
實現細節
- 點坐標範圍未給,建議離散化或用哈希映射
(x,y) -> id。- 輸入可能多測試用例,直到 EOF。
- K 可能較大,用
nth_element或部分排序優化 Top-K 選擇。相關題目延伸
- HDU 1213 / POJ 1988 / UVA 10147 — 經典並查集應用。
- 二維網格連通分量:DFS/BFS 同理,但並查集更適合動態添加點場景。