模板 左偏樹

2022-04-29 20:42:14 字數 1225 閱讀 9884

可在log複雜度合併的堆

每個節點有乙個距離,具體定義我不知道

1.滿足堆的性質

2.左子節點距離》=右子節點

3.節點距離=右子節點距離加1

按照以上的性質實現merge(x,y),先選出x,y中比較大的那個(大根堆為例),再拿它的右兒子和另乙個去merge,如果merge出來不符合性質2就swap一下,最後更新自己的距離

於是也能實現pop,就是把根節點的左右孩子merge起來

實現過程中只需要記孩子不需要記父親,但可以仿照並查集的樣子記父親來做到給乙個點查它所屬的根

luogu3377

一開始有n個小根堆,每個堆包含且僅包含乙個數。接下來需要支援兩種操作:

操作1: 1 x y 將第x個數和第y個數所在的小根堆合併(若第x或第y個數已經被刪除或第x和第y個數在用乙個堆內,則無視此操作)

操作2: 2 x 輸出第x個數所在的堆最小數,並將其刪除(若第x個數已經被刪除,則輸出-1並無視刪除操作)

1 #include2

#define pa pair3

#define clr(a,x) memset(a,x,sizeof(a))

4#define mp make_pair

5using

namespace

std;

6 typedef long

long

ll;7

const

int maxn=1e5+10;8

9 inline char

gc()

14inline ll rd()

17while(c>='

0'&&c<='

9') x=(x<<1)+(x<<3)+c-'

0',c=gc();

18return neg?(~x+1

):x;19}

2021

int ch[maxn][2

],fa[maxn],v[maxn],dis[maxn],n,m;

2223 inline int getf(int

x)26

27 inline int merge(int x,int

y)37

38 inline int pop(int

x)43

44int

main()else60}

61return0;

62 }

左偏樹 模板

神經病也可以寫成右偏樹 具體左偏指左節點的距離 geq 右節點的距離 距離指離最近擁有空節點的節點的距離 乙個節點的值一定 或 leq 或 geq 或 其子節點的值 由於左偏性質,每次可以合併至右邊,維護左偏性質後就可以保證複雜度 被踩爆的板子 或者是我?include define ls lson...

模板 左偏樹

洛谷模板題 一聽左偏樹這個名字就感覺左偏。左偏樹是什麼,好像就是個堆,大根堆或小根堆,可以支援合併,取堆頂元素,刪除堆頂元素,插入元素的操作。一些說明 左偏樹節點除了應有的東西,還有鍵值和距離,鍵值用於比較大小,距離是什麼?距離是這樣定義的 節點i稱為外節點 external node 當且僅當節點...

模板 左偏樹

左偏樹是一棵二叉樹,也是一種可並堆,擁有堆的性質,可以像堆一樣合併。左偏樹顧名思義,有 左偏 的特點,既每個左子樹節點的 dist 一定大於等於右子樹節點的 dist 由性質2可得 t x d t t x ch 1 d 1 同時,我們需要注意左偏樹的 dist 並不意味著深度,跟深度無關。講了這麼久...