BZOJ3674 可持久化並查集加強版

2022-05-08 04:57:11 字數 1925 閱讀 2183

description:

自從zkysb出了可持久化並查集後……

hzwer:亂寫能ac,暴力踩標程

kuribohg:我不路徑壓縮就過了!

ndsf:暴力就可以輕鬆虐!

zky:……

n個集合 m個操作

操作:1 a b 合併a,b所在集合

2 k 回到第k次操作之後的狀態(查詢算作操作)

3 a b 詢問a,b是否屬於同一集合,是則輸出1否則輸出0

05 6

1 1 2

3 1 2

2 13 0 3

2 13 1 210

1正解:啟發式合併+線段樹

解題報告:

這道題是啟發式合併的練手好題…

為了滿足題目要求,我需要對於每個歷史版本維護fa,想想就會發現這個其實和主席樹是有相通之處的,都是每個節點維護了一棵線段樹,然後每次修改只會修改到一條鏈,這道題也是一樣的。

那麼我對於每個節點維護一棵線段樹,其中只有葉子節點裡面儲存了關鍵資訊,其餘節點其實沒有任何資訊的儲存。

我記錄一下每個歷史版本的線段樹的根節點,可以把當前狀態直接指向歷史版本中的根,所以可以做到o(1)撤銷。

查詢的話直接查在當前狀態下是否是同乙個祖先即可,注意不能路徑壓縮。還有就是講一下按秩合併的相關問題,首先秩表示的是以這個元素為祖先的所有元素中的最大深度。

很明顯,並查集的複雜度直接和查詢的最大深度有關,所以我應該以最大深度作為合併時的評判標準。

然後只有在合併之前兩棵子樹秩相同的時候,才需要修改新樹的秩,否則由於小的那個的秩《大的那個的秩,最大深度不會超過大的那個。

這是一點細節上的說明。

//it is made by ljh2000

#include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const int maxn = 200011;

const int maxm = 5000011;

int n,m,root[maxn],cnt,ans;

struct nodea[maxm];

inline int getint()

inline void build(int &k,int l,int r)

int mid=(l+r)>>1; build(a[k].ls,l,mid); build(a[k].rs,mid+1,r);

}inline int query(int rt,int l,int r,int val)

}inline void add(int &k,int from,int l,int r,int val)

a[k].ls=a[from].ls; a[k].rs=a[from].rs;

int mid=(l+r)>>1;

if(val<=mid) add(a[k].ls,a[from].ls,l,mid,val);

else add(a[k].rs,a[from].rs,mid+1,r,val);

}inline void update(int &k,int from,int l,int r,int a,int fa)

a[k].ls=a[from].ls; a[k].rs=a[from].rs;

int mid=(l+r)>>1;

if(a<=mid) update(a[k].ls,a[from].ls,l,mid,a,fa);

else update(a[k].rs,a[from].rs,mid+1,r,a,fa);

}inline int find(int rt,int x)

inline void work()

else if(ljh==2)

else else

} }}int main()

BZOJ 3674 可持久化並查集

3674 可持久化並查集加強版 time limit 15 sec memory limit 256 mb submit 4051 solved 1503 submit status discuss description description 自從zkysb出了可持久化並查集後 hzwer 亂寫...

bzoj 3674 可持久化並查集)

傳送門 題解 一道可持久化並查集的裸題,板子子對了就能過 可持久化並查集是基於主席數的一種結構,可持久化並查集要求能夠訪問歷史版本,跟主席樹很像,所以可以通過主席樹維護普通並查集的fa陣列,但是由於用主席樹維護後沒有辦法用路徑壓縮,所以需要採用新的合併方式 啟發式合併,對每乙個節點增加乙個level...

bzoj 3674 可持久化並查集加強版

description 自從zkysb出了可持久化並查集後 hzwer 亂寫能ac,暴力踩標程 kuribohg 我不路徑壓縮就過了!ndsf 暴力就可以輕鬆虐!zky bzoj 3673的加強版。就沒了。include using namespace std const int n 200000 ...