學了可持續化陣列之後,趁熱打鐵拿下可持久化並查集
理解之後就大致是當抄板子用,畢竟手敲還要敲很久
不得不承認,此生不如noi爺,只願自己能做乙個努力種技能樹的acmer
可持久化並查集=可持久化陣列+葉子結點維護並查集par關係和dep關係+並查集合並
dep[rt]是從rt這個節點往下搜的最大鏈長,其實也就是以rt為樹根的樹的最深的葉子的深度
dep陣列用於按秩合併,秩這個字,不用太糾結,直接叫它按鏈長合併可能更通俗一些
按秩合併,就是按dep陣列的值合併,或者平時並查集union裡常用rank陣列,含義是一樣的
這麼做,是讓矮樹的樹根接到高樹的樹根上去,盡量防止樹的退化
每個葉子結點now維護的是這個點的位置的pos的父親和秩,
但是par[now]=pos2記錄的是父親的位置,秩記錄的是在當前狀態下pos所在的樹
由於秩只在以後樹的修改會用到,在查詢的時候只會查詢par的值
所以每個葉子結點只記錄乙個當前秩即可,無需維護歷史值
查詢值的時候返回葉子結點編號now,便於對該節點的資訊進行修改
按秩合併
每個點上的值是這個點的當前的秩,x的秩<=y的秩
①x的秩
合併x和y時,直接把x的根連到y的根上即可
②x的秩==y的秩
合併x和y的時候,把x的根連到y的根上之後,再對y的根的秩加一
y的子樹錯了不用管,合併的時候只會用到根的秩,保證其正確即可
build函式,建樹,現用現開點,葉子結點維護的par值是其父親的pos
merge函式,合併過程第一部分,新開一條鏈,並將鏈的葉子結點的par值修改,dep值沿用歷史版本
find函式,並查集找祖先,無路徑壓縮,返回的是祖先的pos所在葉子結點的標號now,且此刻par[now]就是pos
update函式,合併過程的第二部分(x秩==y秩時),對y的新版本的鏈的葉子結點的dep值+1
query函式,返回代表pos位置的葉子結點的標號
恢復為歷史版本x,root[i]=root[x]
更新乙個版本,新建乙個版本root[i],先沿用(恢復為)上乙個版本root[i-1],再呼叫merge函式對root[i]進行新建結點操作
博主的講解風格清晰,**風格也是好評,noi爺就是強鴨……
區域性靜態變數static int避免了多次開浪費記憶體;
命名空間namespace的使用避免了某些定義的衝突,封裝性的體現
感覺自己揹著敲也敲不出來,就套人家板子叭……
#include#define n 301000
using namespace std;
templateinline void read(t &x)
while(isdigit(c))
x*=p;
}int n,m;
int l[n*30],r[n*30],fa[n*30],dep[n*30];
int root[n*30];
namespace persistant_union_set
build(lson);build(rson);
}void merge(int last,int &rt,int l,int r,int pos,int fa)
if(pos<=mid)merge(l[last],lson,pos,fa);
else merge(r[last],rson,pos,fa);
}void update(int rt,int l,int r,int pos)
if(pos<=mid)update(lson,pos);
else update(rson,pos);
}int query(int rt,int l,int r,int pos)
int find(int rt,int pos)
#undef mid
#undef lson
#undef rson
}using namespace persistant_union_set;
int main()
}else if(opt==2)root[i]=root[x];
else if(opt==3)
}return 0;
}
可持久化並查集總結
標籤 資料結構 可持久化 可持久化並查集 閱讀體驗 其實看起來很高大上,最後還不是淪為被我這種菜雞都能學會的東西 嗯,我只是想解釋這個並不是很難。連我這麼弱都。然後還是以模板題為背景將比較好。洛谷題目傳送門 其實可持久化並查集就是要支援回到以前的版本 模擬可持久化 陣列 線段樹 之類的 那麼我都模擬...
可持久化並查集
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是上一次的輸出答案 並查集實質是乙個陣列,可持久化並查...
可持久化並查集
可持久化陣列 可持久化陣列是一種可以回退,訪問之前版本的陣列 是一些其他可持久化資料結構的基石 例如可持久化並查集 與普通並查集不同的是 這裡用到了 按秩合併新增鏈結描述 include const int n 2e5 7 int rootfa n rootdep n cnt,tot struct ...