uva 11987
題目連線
0;}緊接著囚犯的是偽可持久化並查集(動態並查集)
同樣的,這裡也用到了映象的思想,以多開一倍空間來儲存自己的另外一種狀態。從而來實現動態的並查集father[i]=i+n;father[i+n]=i+n;
就是這樣,i與i』(i+n)同時指向了i+n這樣乙個虛擬id,接下會發生什麼就可以模擬了。如果x union y,則x指向y的虛擬id,重指y時並不會改變x及曾是x的子節點因並查集而變到f[y]只是指向乙個虛擬id的事實,從而一切的動態移除,合併,統計就可以在並查集強大的空間複雜度為o(n),建立乙個集合的時間複雜度為o(1),n次合併m查詢的時間複雜度為o(malpha(n))的處理下解決了。
先來三個點1,2,3
建立它們的映象
操作1 union 1 與 2(本來應該這樣)
實際上是這樣
這樣union 3 與 1,move 2 to another point
就會這樣(虛線代表本身的union物件,實線表示路徑壓縮後的union物件)
我們發現了1與3仍在乙個集合內(2的映象5中),只是2指向了x,但以2為父親的1與3未受其move的印象。
這就是映象的終極奧義,在虛擬中完成實際的操作(好中二的說。。。。)
欲知後事如何(還有後事?)(廢話可持久化還沒有實現呢!):
請看下期 可持久化並查集(三)——從動態到可持久化
可持久化並查集
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 ...
可持久化並查集
點此看題 並查集最重要的就是fafa fa陣列,我們可以拿主席樹來維護這個fafa fa,並且每次改點只需要改乙個,為保證時間複雜度我們再維護乙個dep depde p來做啟發式合併,這就變成了乙個單點修改,單點查詢的主席樹了。include include using namespace std ...