可在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 並不意味著深度,跟深度無關。講了這麼久...