POJ 1988 帶權並查集

2021-10-07 08:43:59 字數 1305 閱讀 1712

題意

傳送門 poj 1988

題解堆的合併用帶權並查集維護。對於每乙個節點 i

ii,維護以此節點為根節點(堆底)的堆的元素數量 sz[

i]

sz[i]

sz[i

],以及此節點到其根節點的高度 h[i

]h[i]

h[i]

。設 chi

ld

child

chil

d 為合併操作的 x

xx 所在集合的根節點,fat

he

rfather

father

為合併操作的 y

yy 所在集合的根節點,則合併堆時

h [c

hild

]+=s

z[fa

ther

],sz

[fat

her]

+=sz

[chi

ld

]h[child]+=sz[father],sz[father]+=sz[child]

h[chil

d]+=

sz[f

athe

r],s

z[fa

ther

]+=s

z[ch

ild]

因為 h[i

]h[i]

h[i]

維護的是節點間的相對高度,輸出答案時要 fin

d(i)

find(i)

find(i

) 查詢一次,計算絕對高度。

#include

#include

#include

#include

#include

using

namespace std;

#define min(a, b) ((a) < (b) ? (a) : (b))

#define max(a, b) ((a) > (b) ? (a) : (b))

#define maxn 30005

int par[maxn]

, h[maxn]

, sz[maxn]

;void

init

(int n)

}int

find

(int x)

void

merge

(int x,

int y)

intmain()

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 當前元素到樹根的距...

POJ1988(帶權並查集,搬磚塊)

題意 可以這樣理解,有n快方形積木,一開始都是單獨的放到哪,然後有兩種操作 1 m a b 把a所在的那一堆落到b所在那一堆的上面 一開始自己是一堆 2 c a 問a下面有多少個積木 思路 感覺很久以前杭電上見過這個題目,比較簡單的帶權並查集,我們可以維護兩個權來滿足要求,第乙個就是記錄集合元素個數...