可並堆模板題 mergeable heap

2022-07-13 19:36:17 字數 708 閱讀 2487

有n個點,第i個點標號為i,有兩種操作:

0 x y 表示把x所在堆和y所在堆合併。

1 x 表示詢問x所在堆的最小權。

第一行兩個整數n,m,表示有n個點m個操作。

接下來m行操作如題。

對於每個詢問操作輸出其答案。

5 31 4

0 2 4

1 44

2n,m<=100000

solution

可並堆模板題,看到這道題第一眼裸並查集可做,但為了訓練可並堆,此題我們採取可並堆來解決。(雖然還是得用並查集)

用並查集維護每個元素所在堆的根節點,合併即可。注意每次合併的應該是讀入元素的根節點,而不是其本身。否則會導致每個點的根節點十分混亂,re。同時合併的同時應該判斷合併的兩點是否屬於同乙個堆,如果是不用再合併,如果不是,則繼續合併。

code

#include #include 

using

namespace

std;

int l[100100],r[100100],dis[100100],f[100100

];int merge(int x,int

y)int find(int

x)int

main()

if(a==1

)

}}

模板 可並堆

想學非旋轉的treap 然後看到裡面提到斜堆 順便學了學可並堆 可並堆 1.左偏樹 其實他介紹了4種可並堆 2.斜堆 好像說是類似平衡樹里的 splay merge a,b b.val 大根堆 merge a.r,b swap a.l,a.r 細節什麼的還有一點 大體思想是合併a和b時 先合併a的右...

左偏樹 可並堆 模板

我想您應該會二叉堆吧,它包含三個操作,這裡與小根堆為例 1 查詢最小值 2 彈出最小值 3 插入乙個值 可以使用st l 的pr iori ty que ue實現,也可以用pb ds中的庫實現,當然也可以手寫反正我不會,筆者是用的系統堆 包含在庫al gori thm include include...

左偏樹(可並堆)模板

待 參考資料1 題意 有n個小根堆,一開始每個小根堆都只有乙個數,現在要進行m次操作,操作有兩種 1,x,y 將第x個數所在堆和第y個數所在堆合併 如果x或y已經被刪除則無視這次操作 2,x 查詢第x個數所在堆的最小數並刪除這個數 如果x或y已經被刪除則輸出 1 資料範圍 n,m 1e5 code ...