有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 #includeusing
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 ...