(神經病也可以寫成右偏樹 )
具體左偏指左節點的距離≥
\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 並不意味著深度,跟深度無關。講了這麼久...