並查集高階

2022-09-21 15:24:07 字數 1463 閱讀 5694

n 個孤立點,m 次加邊操作,設 \(l(i,j)\) 表示結點 i 和 j 最早在第 \(l(i,j)\) 次操作後連通。在 m 次操作後,求出 \(\sum_^n\sum_^n l(i,j)\) 的值。

解法

\(\quad\)並查集的時候記錄子樹大小即可。

n 個孤立點, m 次加邊操作,q 次詢問,每一次問 u 和 v 最早在第幾次操作後連通。

解法

\(\quad\)考慮在並查集合並的時候記錄\(\lceil\)並查集生成樹\(\rfloor\),也就是如果第 i 此操作 u 和 v 在兩個不同的子樹,那麼把 (u,v) 這條邊納入生成樹。邊權是 i ,那麼查詢就是詢問 u 到 v 路徑的邊權最大值,可以用倍增或樹剖。複雜度為 \(o(nlogn)\)。事實上這個思想和 kruskal 重構樹的思想很像。

n 個孤立點,m 次加邊操作,q 次詢問,每次詢問第 x 個點在第 t 個操作後所在連通塊的大小

解法

乙個長度為 n 的 01 序列 \(a_1,...,a_n\),一開始全是 0 ,接下來進行 m 次操作:

解法

\(\quad\)建立乙個並查集 \(f_i\) 表示 \(a_i,...,a_n\) 左數第乙個為 0 的位置。初始時 \(f_i=i\),對於 \(a_x=1\) 的操作,如果本身是 1 就不管,否則 \(f_i=f_\)。時間複雜度:$ o(nlogn)$

給出三個長度為 n 的正整數序列 a,b,c。列舉 \(1\leq i\leq j\leq n\) ,求\(a_i\times b_j\times min_ \space c_k\) 的最大值。

解法

\(\quad\)按權值從大到小考慮\(c_k\)。相當於重新構造乙個空的序列,在位置 k 上加入乙個點,然後將 k-1 和 k+1 位置上的點(如果有點的話)所在的連通塊與之合併。連通塊記錄 a 的最大值和 b 的最大值,在合併的時候記錄答案即可。

給出一顆 n 個點的樹,接下有 m 次操作

解法

\(\quad\)對於每乙個加邊操作,我們可以認為是 a 到 b 在樹上的路徑被覆蓋一次。詢問就可以轉換為 u 到 v 在樹上的路徑中是否存在沒有被覆蓋過的邊,如果不存在說明 u 到 v 之間有至少兩條邊不相交的路徑。

\(\quad\)可以考慮用並查集維護。給定樹根,設 \(f_i\) 表示 \(i\) 到根的路徑中第乙個未被覆蓋的邊.每次操作就個暴力跳並查集,覆蓋一條邊後,就將自己和那條邊的父節點合併即可。這樣每一條邊最多被覆蓋 n 次。總複雜度為 \(o(nlogn)\)

\(\quad\)總的複雜度:\(o(nlogn +m logn)\)

\(\quad\)並查集的按軼合併優化正是啟發式合併的思想,而且並查集生成樹和 kruskal 重構樹也有很多共通點。靈活應用並查集可以很好的解決圖的連通性問題。

並查集入門 高階

入門解釋 高階解釋 入門篇模板 define arr size 100 int pre arr size int deep arr size void init int pre find int x return pre find pre x 遞迴查詢 void unite int x,int y ...

KMP,Tire,高階並查集

acwing tire int son n 26 cnt n idx 0號點既是根節點,又是空節點 son儲存樹中每個節點的子節點 cnt儲存以每個節點結尾的單詞數量 插入乙個字串 void insert char str cnt p 查詢字串出現的次數 int query char str ret...

詳解 並查集高階技巧 加權並查集 擴充套件域並查集

可以理解為使用陣列實現的樹形結構,只儲存了每個節點的父節點 前驅 功能為 合併兩個節點 及其所在集合 查詢節點所屬集合的代表節點 可以理解為根節點 以6個元素為例 編號0到5 把0單獨劃分為乙個集合 把1,2,3,4劃分為乙個集合 把5單獨劃分為乙個集合。n個元素的並查集,只需要乙個容量為n的陣列f...