luogu P3377 左偏樹(可並堆)

2022-05-25 12:48:15 字數 876 閱讀 9205

傳送門:

左偏樹:左偏!也就是下面這種左邊大,右邊小的樹

可並堆:可以合併的堆(堆:維護最值的資料結構)

核心(細節): 

先來**

int merge(int x,int

y)

在合併時,往右子樹走,當發現右邊的值不合法時,則另另乙個堆的值來swap

以最大值為例: 當發現x每次合併完之後更新高度(乙個節點的高度=它的右兒子高度+1)

還有一點就是在刪除的時候,先找到堆頂,刪除,然後merge(rs[x],ls[x])

記得令 root[x]=merge(rs[x],ls[x]) 因為有路徑壓縮,所以有很多節點的top還是x

#include#include

#define r register

using

namespace

std;

int n,m,val[100100],rt[100100],ls[100100],rs[100100],h[100100

];int find(int

x)int merge(int x,int

y)void pop(int

x)int

main ()

h[0]=-1

;

for(r int c,x,y,i=1;i<=m;i++)

else}}

return0;

}

view code

luoguP3377 模板 左偏樹(可並堆)

題目描述 如題,一開始有n個小根堆,每個堆包含且僅包含乙個數。接下來需要支援兩種操作 操作1 1 x y 將第x個數和第y個數所在的小根堆合併 若第x或第y個數已經被刪除或第x和第y個數在用乙個堆內,則無視此操作 操作2 2 x 輸出第x個數所在的堆最小數,並將其刪除 若第x個數已經被刪除,則輸出 ...

luogu3377 左偏樹 可並堆

題目鏈結 左偏樹的模板題,參考左偏樹學習筆記 對於這道題我是用乙個並查集維護出了哪些點是在同一棵樹上,也可以直接log的往上跳尋找根節點 include include include include include includeusing namespace std typedef long l...

洛谷 3377 模板 左偏樹(可並堆)

題目傳送門 作為乙個合格的蒟蒻,我們當然在學每一種演算法後都要去做一些和這種演算法有關的模板題。毫無疑問,這是一道左偏樹的模板題。伏地膜大佬,這位大佬對左偏樹的解釋十分到位。左偏樹就是在堆的基礎上加上了距離的概念。距離指的是每乙個節點到離他最近的不滿節點的距離。若乙個節點的左兒子或右兒子為空,則該節...