大意:維護一種資料結構,支援 幾乎是常數級別的 集合合併、將乙個元素轉移到另乙個集合、詢問每個集合的和與元素個數。
program p11987;var n,m,i,p,q,op,top:longint;
f,c,pos,s:array[0..500002] of longint;
function find(p:longint):longint;
begin
if f[p]=p then exit(p);
f[p]:=find(f[p]);
exit(f[p]);
end;
procedure union(p,q:longint);
var fp,fq:longint;
begin
fp:=find(pos[p]);
fq:=find(pos[q]);
if fp=fq then exit;
if c[fp]0 do
begin
dec(m);
read(op);
case op of
1:begin
readln(p,q);
union(p,q);
end;
2:begin
readln(p,q);
move(p,q);
end;
3:begin
readln(p);
writeln(c[find(pos[p])],' ',s[find(pos[p])]);
end;
end;
end;
end;
end.
帶權並查集 刪除 UVA11987
題意 n個數字 m個操作 1 x y 合併 x,y 2 將x元素移動到y元素所在的集合 3 輸出x集合中元素個數,和總和 思路 刪除並查集 並非把根節點或者子節點直接刪除,而是保留。之後將刪除的元素放到陣列最後進行新一輪操作。而原值所在的集合的權在刪除時進行更新就好 刪除並查集實現 既然要更新元素到...
uva11987 帶刪除的並查集
題意 初始有n個集合,分別為 1 2 3 n。有三種操件 1 p q 合併元素p和q的集合 2 p q 把p元素移到q集合中 3 p 輸出p元素集合的個數及全部元素的和。題解 並查集。只是並查集中並沒有刪除的操作。所以就需要將刪除的這個點的影響降到0,也就是給刪除的點申請乙個新的id,以後都是用這個...
詳解 並查集高階技巧 加權並查集 擴充套件域並查集
可以理解為使用陣列實現的樹形結構,只儲存了每個節點的父節點 前驅 功能為 合併兩個節點 及其所在集合 查詢節點所屬集合的代表節點 可以理解為根節點 以6個元素為例 編號0到5 把0單獨劃分為乙個集合 把1,2,3,4劃分為乙個集合 把5單獨劃分為乙個集合。n個元素的並查集,只需要乙個容量為n的陣列f...