bzoj3674 可持久化並查集加強版

2022-03-25 05:47:17 字數 2407 閱讀 6509

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

description

description:

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

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

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

ndsf:暴力就可以輕鬆虐!

zky:……

n個集合 m個操作

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

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

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

請注意本題採用強制**,所給的a,b,k均經過加密,加密方法為x = x xor lastans,lastans的初始值為0

0  input

output

sample input

5 61 1 2

3 1 2

2 13 0 3

2 13 1 2

sample output

1  0

1  hint

source

出題人大sb++

做法同bzoj3673,只是加了乙個強制**,資料範圍擴大。

#include

#include

#include

#include

#include

#include

#define f(i,j,n) for(int i=j;i<=n;i++)

#define d(i,j,n) for(int i=j;i>=n;i--)

#define ll long long

#define maxn 200005

#define maxm 10000000

using namespace std;

int n,m,p,x,y,cnt,ans;

int rt[maxn],v[maxm],ls[maxm],rs[maxm];

inline int read()

int x=0,f=1;char ch=getchar();

while (ch'9')

while (ch>='0'&&ch<='9')

return x*f;

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

k=++cnt;

if (l==r)

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

build(ls[k],l,mid);build(rs[k],mid+1,r);

int query(int k,int l,int r,int pos)

if (l==r) return v[k];

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

if (pos<=mid) return query(ls[k],l,mid,pos);

else return query(rs[k],mid+1,r,pos);

void insert(int x,int &y,int l,int r,int pos,int val)

y=++cnt;

if (l==r)

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

ls[y]=ls[x];rs[y]=rs[x];

if (pos<=mid) insert(ls[x],ls[y],l,mid,pos,val);

else insert(rs[x],rs[y],mid+1,r,pos,val);

int find(int &root,int x)

int tmp=query(root,1,n,x);

if (tmp==x) return x;

else

int ret=find(root,tmp);

insert(root,root,1,n,x,ret);

return ret;

int main()

n=read();m=read();

build(rt[0],1,n);

f(i,1,m)

p=read();

if (p==1)

int x=read()^ans,y=read()^ans,fx=find(rt[i-1],x),fy=find(rt[i-1],y);

if (fx==fy) rt[i]=rt[i-1];

else insert(rt[i-1],rt[i],1,n,fx,fy);

else if (p==2)

int x=read()^ans;

rt[i]=rt[x];

else

int x=read()^ans,y=read()^ans,fx=find(rt[i-1],x),fy=find(rt[i-1],y);

ans=fx==fy?1:0;

printf("%d\n",ans);

rt[i]=rt[i-1];

return 0;

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 ...