可持久化4--可持久化并查集
生活随笔
收集整理的這篇文章主要介紹了
可持久化4--可持久化并查集
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
可持久化并查集
可持久化并查集 = 按秩合并并查集 + 可持久化數組
首先并查集不能采用路徑壓縮,這是因為一次findR操作中,fa數組的很多位置(u->ru)會發生修改,由于每次修改都需要在可持久化數組上復制產生log個新結點,空間復雜度過大。我們不希望每個版本的fa數組的差別太大,最好只有常數個位置改變。
啟發式合并/按秩合并
當 merge(u,v) 時,找到ru,rv后,讓 sz 小的接在sz大的下面:
if(sz[ru] > sz[rv]) swap(ru,rv); fa[ru] = rv; sz[rv] += sz[ru]或者讓高度(到葉子的最長距離)height 小的接在 height 大的下面:
if(height[ru] > height[rv]) swap(ru,rv); fa[ru] = rv; if(height[ru] == height[rv]) ++height[rv];按sz合并一般稱為啟發式合并,按height合并一般稱為按秩合并,二者的復雜度都是logN(每向上走1條邊,身處的子樹sz至少擴大1倍),且每次 merge 操作時,fa數組只有2個位置會發生修改(fa[ru]和sz[rv]),直接用可持久化下標線段樹維護fa數組就可以實現可持久化。
空間復雜度是O(NlogN)
時間復雜度是O(Nlog2NNlog^2NNlog2N)
例題:
P3402 可持久化并查集
「NOI2018」歸程
總結
以上是生活随笔為你收集整理的可持久化4--可持久化并查集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P2403 [SDOI2010]所驼门王
- 下一篇: 可持久化汇总(讲解+题目)