BZOJ3673 可持久並查集

2021-08-09 09:44:36 字數 1032 閱讀 3174

可以用線段樹維護 每個葉子結點存它父親的位置 查乙個點的父親和正常並查集差不多 記錄每個點的深度 當要相連的兩個點深度相同時 (p,q) 把q的deep++ 整體用主席樹維護

copy hzwer的 orz

#include

#include

using namespace std;

inline int

read()

returnx;}

int n,m,sz;

int root[200005],ls[2000005],rs[2000005],v[2000005],deep[2000005];

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

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

build(ls[k],l,mid);

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

}void modify(int l,int r,int

x,int &y,int

pos,int val)

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

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

if(pos

<=mid)

modify(l,mid,ls[x],ls[y],pos,val);

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

}int query(int k,int l,int r,int

pos)

void add(int k,int l,int r,int

pos)

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

if(pos

<=mid)add(ls[k],l,mid,pos);

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

}int find(int k,int

x)int main()

if(f==2)

if(f==3)

}return

0;}

bzoj3673 可持久化並查集

bzoj 我們考慮把每個操作建成乙個點 i 對於 1 和 3 操作,連邊 i 1,i 對於 2 操作,連邊 k i,i 容易發現這是一棵樹,並且並查集的操作可以回退,那麼我們直接在樹上dfs,在進入節點 回溯時處理merge split 查詢即可.時間複雜度 o m log n 超短.pragma ...

BZOJ 3673 可持久化並查集 by 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 0 3 1 2 2 1 3 1 2 1 0 1可持久化並查集不好寫,我們考慮到並查集的寫法就是...

bzoj 3673可持久化並查集 by zky

n個集合 m個操作 操作 1 a b 合併a,b所在集合 2 k 回到第k次操作之後的狀態 查詢算作操作 3 a b 詢問a,b是否屬於同一集合,是則輸出1否則輸出0 可持久化並查集模板題 並查集實質是乙個陣列,可持久化並查集就是乙個可持久化陣列,可以用可持久化線段樹維護,本質就是這樣 只有葉子節點...