有權並查集,Poj 1988

2022-04-01 08:18:43 字數 991 閱讀 2654

題目大意:

有n個從1到n編號的箱子,將每個箱子當做乙個棧,對這些箱子進行p次操作,每次操作分別為以下兩種之一:

輸入 m x y:表示將編號為x的箱子所在的棧放在編號為y的箱子所在棧的棧頂.

輸入 c x:計算編號為x的所表示的棧中在x號箱子下面的箱子數目.

思路:move a,b的時候(合併的時候),b其中乙個作為子樹,dist[fb],距離根節點的距離為size[fa],然後size[fa]+=size[fb];

count c的時候,就是size[fa[c]]-dist[c]-1啦。

注意的是:find_set的時候,要將dist處理好啦,(還是在同乙個樹中)

if(x!=father[x])

int t=father[x];

father[x]=find_set[father[x]];

dist[x]+=dist[t];

#include #include 

#include

#include

#include

using

namespace

std;

const

int maxn = 30000+10

;int

father[maxn];

int size[maxn]; ///

表示團的大小

int dist[maxn]; ///

到根節點的距離

int find_set(int

x)

return

father[x];

}void union(int x,int

y)int

main()

intt;

scanf("%d

",&t);

getchar();

while(t--)

else

}return0;

}

帶權並查集 POJ1988

題目鏈結在這裡 題目大概的意思就是兩種操作,一種是把含有x的整個棧放到含有y的整個棧上面。另外一種是問x下面有多少個物品。物品數目是30,000以內,操作次數在100,000以內。一開始的時候我們想的是直接模擬?這個毫無疑問是不可以的。但是一眼看過去,似乎和並查集沒什麼關係?這個時候,我們從棧開始分...

poj1988 帶權並查集

帶權並查集的應用 題意 說是有n塊磚,編號從1到n,有兩種操作,第一是把含有x編號的那一堆磚放到含有編號y的那一堆磚的上面 第二是查詢編號為x的磚的下面有多少塊磚。思路 帶權並查集,用dis i 表示元素i下邊有多少個元素,num i 表示元素i所在堆的磚塊總數 或者說dis i 當前元素到樹根的距...

POJ 1988 帶權並查集

題意 傳送門 poj 1988 題解堆的合併用帶權並查集維護。對於每乙個節點 i ii,維護以此節點為根節點 堆底 的堆的元素數量 sz i sz i sz i 以及此節點到其根節點的高度 h i h i h i 設 chi ld child chil d 為合併操作的 x xx 所在集合的根節點,...