左偏樹 模板

2021-09-29 09:45:47 字數 1581 閱讀 7620

(神經病也可以寫成右偏樹 )

具體左偏指左節點的距離≥

\geq

≥右節點的距離

距離指離最近擁有空節點的節點的距離

乙個節點的值一定≤(或

≥)

\leq (或\geq)

≤(或≥

)其子節點的值

由於左偏性質,每次可以合併至右邊,維護左偏性質後就可以保證複雜度

被踩爆的板子(或者是我?)

#include

#define ls lson[x]

#define rs rson[x]

using

namespace std;

const

int n=

1e5+10;

int n,m;

int lson[n]

,rson[n]

,rt[n]

,f[n]

;int dis[n]

,val[n]

;intfa(

int x)

intmer

(int x,

int y)

void

del(

int x)

intmain()

while

(m--

)else}}

}

交上去,驚喜的發現,tle @qaq!

因為我們要維護左偏樹性質,所以

不能路徑壓縮

不能路徑壓縮

不能路徑壓縮

主要是因為在遞迴到最底層之後往上反的過程中,會用到它的直接父親,而這時我們的路徑壓縮會覆蓋子節點們的直接父親,記錄的只是他所在的樹的根,而這樣的話我們的遞迴就無法實現了qaq

——某位大佬

但是這道題不用路徑壓縮就會涼

於是到處維護父節點,就可以路徑壓縮了(不知道其他題可以嗎?)

#include

#define ls lson[x]

#define rs rson[x]

using

namespace std;

const

int n=

1e5+10;

int n,m;

int lson[n]

,rson[n]

,rt[n]

,f[n]

;int dis[n]

,val[n]

;bool dl[n]

;intfa(

int x)

intmer

(int x,

int y)

void

del(

int x)

intmain()

while

(m--

)else}}

}

更多操作

1.刪除根節點

2.得到根節點

3.插入新節點

4.刪除任意已知節點(???)

模板 左偏樹

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

模板 左偏樹

可在log複雜度合併的堆 每個節點有乙個距離,具體定義我不知道 1.滿足堆的性質 2.左子節點距離 右子節點 3.節點距離 右子節點距離加1 按照以上的性質實現merge x,y 先選出x,y中比較大的那個 大根堆為例 再拿它的右兒子和另乙個去merge,如果merge出來不符合性質2就swap一下...

模板 左偏樹

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