疊積木(加權並查集)

2022-03-14 12:22:23 字數 1193 閱讀 3580

題目描述:

約翰和貝西在疊積木。共有30000塊積木,編號為1到30000。一開始,這些積木放在地上,自然地分成n堆。貝西接受約翰的指示,把一些積木疊在另一些積木的上面。一旦兩塊積木相疊, 彼此就再也不會分開了,所以最後疊在一起的積木會越來越高。約翰讓貝西依次執行p條操作,操作分為兩種:

第一種是移動操作,格式為「移動x到y的上面」。x和y代表兩塊積木的編號,意思是將x所的那堆積木,整體疊放到y所在的那堆積木之上;

第二種是統計操作,格式為「統計z下方的積木數量」。z代表一塊積木的編號,意思是貝西需要報告在編號為z的積木之下還有多少塊積木

請編寫乙個程式,幫助貝西回答每條統計問題。

輸入輸出格式

輸入格式:

第一行:單個整數:p,1≤p≤10^5

第二行到第p + 1行:每行描述一條命令,如果這行開頭的字母是 m,代表一條移動命令,後面的兩個整數代表上文中的x和y;如果開頭字母是 c,代表一條統計命令。後面的整數代表上文中的z,保證所有的移動命令都有意義,x和y不會已經出現在同一堆積木里

輸出格式:

對每乙個統計命令,輸出正確回答,用換行符分開每個查詢的結果

輸入輸出樣例

輸入樣例:

6 m 1 6

c 1

m 2 4

m 2 6

c 3

c 4

輸出樣例:

1 0

2思路

陣列top[x]表示x所屬的棧頂元素。

陣列cnt[x]表示x到棧底的元素個數。

陣列father[x]表示x的棧底元素。

#include

using

namespace

std;

const

int maxn=30010;

int n,father[maxn],cnt[maxn],top[maxn];

char c;

int find(int x)

void unionn(int f1,int f2)

int main()

else

luoguP2342 疊積木(並查集)

傳送門 up i 表示乙個木塊上面有多少個 all i 表示整個連通塊內有多少個 那麼 乙個木塊下面的木塊個數為 all root i up i 1 注意 up i 可以在 find 函式中維護,而 all i 不好維護,那麼我們只需要祖先節點的 all i 表示整個連通塊內木塊的數目即可 合併時也...

疊箱子 並查集

題目 話說上次偉神和肖神去買東西,由於偉神身材瘦削,體力不支所以沒能把肖神想要的東西都揹回來,最後還是在基地同學的幫助下,才勉強揹回了價值最大的物品。對於這個事情,肖神非常不滿,於是,肖神為偉神制定了一套鍛鍊身體的方案。肖神從網上網購了 n 個石塊 1 n 30000 這些石塊的編號從1到n不等。肖...

模版 並查集(及其加權)

並查集是經典的圖論演算法,用來維護點與集合的關係,也簡潔明瞭。給定 n nn 個點,有 m mm 次操作,每次操作輸入 pppa aab bb 若 p 1 p 1 p 1 則 合併 aaab bb 若 p 2 p 2 p 2 則 查詢 aaab bb 是否同屬乙個集合 並查集初始化 每個父親點 都 ...