洛谷 3402 模板 可持久化並查集

2022-05-16 01:24:16 字數 1484 閱讀 2144

n個集合 m個操作

操作:輸入格式:

輸出格式:

輸入樣例#1: 複製

5 6

1 1 2

3 1 2

2 03 1 2

2 13 1 2

輸出樣例#1: 複製

1

01

1 ≤ n ≤ 105,1 ≤ m ≤ 2×105

by zky 出題人大神犇

基本和上午那道題一模一樣了??重新寫一下思路清晰很多,也發現了很多細節。

一定要用啟發式合併,就是維護$siz$,小的那一塊合併到大的那一塊去,這樣保證小的每次乘2,保證了複雜度$log$級。不然會t得很慘qaq

還有就是空間一定要開足,在並查集$find$操作裡面不能路徑壓縮,如果壓縮每次都會多$log$的空間複雜度,因為保證深度是$log$,所以不用擔心時間複雜度。

合併時先找到兩點的$fa$再做下一步處理,包括判斷$siz$大小等。

#includeusing

namespace

std;

intn, m;

void read(int &x)

}struct

node pool[

200005*32], *tail = pool, *root[200005], *zero;

node *newnode()

node *build(int l, int

r)

int mid = (l + r) >> 1

; nd -> ls =build(l, mid);

nd -> rs = build(mid + 1

, r);

return

nd;}

node *query(node *nd, int l, int r, int

pos)

int find(node *nd, int

x) node *modify(node *nd, int l, int r, int pos, int

f)

int mid = (l + r) >> 1

;

if(pos <=mid)

else

return

nnd;

}node *change(node *nd, int l, int r, int pos, int

siz)

int mid = (l + r) >> 1

;

if(pos <=mid)

else

return

nnd;

}int

main()

else

if(opt == 2

)

else

}return0;

}

洛谷P3402 模板 可持久化並查集

n個集合 m個操作 1 a b 合併a,b所在集合 2 k 回到第k次操作之後的狀態 查詢算作操作 3 a b 詢問a,b是否屬於同一集合,是則輸出1否則輸出05 6 1 1 2 3 1 2 2 03 1 2 2 13 1 210 1 1 le n le 10 5,1 le m le 2 times...

洛谷 P3402 可持久化並查集

解題思路 可持久化並查集也就是可持續化線段樹 並查集 主席樹 並查集 像我們平常做的並查集都是路徑壓縮,但因為要保證可持續化,所以資訊不能改變,所以我們採用啟發式合併來合併集合。啟發式合併的樹最高深度不會超過log n 1。因為深度為2的樹需要兩個點,那麼深度為3的需要兩個深度為2的也就是2 2 4...

P3402 模板 可持久化並查集

其實看看 自己就可以懂。注意 1.並查集不壓縮路徑,壓縮了就回不到壓縮之前的狀態了。2.並查集合並時,小的往大的合併,啟發式合併。3.對於第i步 不管什麼操作 操作都要把root i roo i 1 我在合併時,如果兩個祖先一樣就直接continue了,沒把root i 賦值為root i 1 一直...