可持久化並查集(知識整理 板子總結)

2021-09-22 02:17:52 字數 2380 閱讀 2495

學了可持續化陣列之後,趁熱打鐵拿下可持久化並查集

理解之後就大致是當抄板子用,畢竟手敲還要敲很久

不得不承認,此生不如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 ...