啟發式合併

2021-09-05 16:20:12 字數 735 閱讀 8556

#includeconst int n=5e5+5;

int f[n],d[n],r[n],p[n];

int find(int i)

int unionn(int i,int j)

int main()

}並查集[按秩啟發式合併]

bzoj4668-冷戰

【題目大意】

給出n個軍工廠和m 個操作,操作分為兩類:

•0 u v,這次操作蘇聯會修建一條連線u號軍工廠及v號軍工廠的鐵路,注意鐵路都是雙向

•1 u v,reddington 需要知道 u 號軍工廠及 v 號軍工廠最早在加入第幾條條鐵路後會聯通,假如到這次操作都沒有聯通,則輸出 0。

【思路】

普通的並查集,每次還要記錄下t[u],t[u]表示u號軍工廠和它的父親是什麼時候連線上的。那麼對於u和v,如果它們連通,那麼就是u->lca(u,v)->v這條路徑上t[u]的最大值。

sample input

5 90 1 4

1 2 5

0 2 4

0 3 4

1 3 1

0 7 0

0 6 1

0 1 6

1 2 6

sample output03

5合併兩樹根:取兩根小值在左且為新根,合併新根右兒與另一樹根至遞迴歸併完,按深度換左右樹,更新深度域

刪樹根:先找根 讀出 然後合併左右子樹

啟發式合併

啟發式合併 暴力合併 將兩個資料結構合併,只需要將小的資料結構中的元素乙個乙個的插入大的資料結構o n o n o n 如果題目只有插入操作沒有 總o n logn o nlogn o nlog n 因為每次合併,所有資料結構總大小為n,設兩個資料結構大小為a,b a b a,b a b a,b a...

啟發式合併

啟發式合併本質上是一種優化的暴力,可用於擁有穩定結構的資料結構。考慮夢幻布丁 hnoi2009 顯然的暴力思路是用鍊錶維護每種顏色的位置,然後每次修改的時候暴力合併兩條鏈。不難證明,這樣的最壞時間複雜度將達到 o n 2 不能接受。可以觀察到,合併的時間複雜度只與被合併的鏈長度有關,所以可以想到優化...

啟發式合併

啟發式合併是對集合合併類問題的一種高效處理方式。通常啟發式合併優化的是合併多個相同資料結構的時間,通過暴力的合併來 將兩個相同 的資料結構合併,從而使得維護的零散資訊 性質 逐漸合一。舉個十分簡單的例子 起初有 n 個陣列,且每個陣列有且僅有 1 個數,接下 來有 n 1 個指令,需要你每次合併兩個...