OI學習筆記 配對堆

2022-05-24 09:03:12 字數 1191 閱讀 9504

配對堆是一種可並堆(可以將兩個堆合併,且速度快),時間複雜度:

合併merge:o(1)     插入push:o(1)     彈出pop:o(logn)

配對堆不是二叉堆(我一開始不知道這個所以一直搞不懂)

配對堆存樹的方式不一樣,如圖,對於每個節點,有一條邊指向最左邊的兒子,一條指向他右邊的兄弟

和普通樹的對比:(靈魂畫圖)(藍色為普通方式,紅色為做兄弟右兒子)

以下均以大根堆為例

很簡單,比較兩樹樹根,將小的的根作為大的左兒子,然後將小的的根的右兄弟指為大的原來的左兒子

如圖:(根的值在點上)

直接將插入的點作為乙個堆,然後和原堆合併

把根斷開

從左到右依次兩兩合併,再從左到右依次合併,具體細節可參考**

#includeinline 

void swap(int &x,int &y)

//大根堆

struct

pairing_heaptree[

10010

];

inttot,root;

pairing_heap(

int _tot=0,int _root=0

):tot(_tot),root(_root){}

int merge(int x,int y)//

有乙個是空樹(為0)

if(tree[x].v

tree[y].r=tree[x].s;tree[x].s=y;

return root=x;

}int push(int

x)

void del(int

x)

intpop()

inttop()

};int

main()

else

if(ques==1

)else

if(ques==2

)else

if(ques==-1

) }

return0;

}

OI學習筆記

組合數遞迴求法 c n k c k c 卡特蘭數 cat n cat 0cat cat 1cat cat cat 1 cat cat 0 fracc n 手動開o2 pragma g optimize 2 費馬小定理 若p為質數,a p equiv a pmod p 可用於求逆元 尤拉定理 若a,n...

配對堆模板

配對堆是一種可並堆 題意 兩種操作,合併兩個堆或者查詢乙個堆的最小值,n 1 06 n leq 10 6 n 106pai ring hea ppairing heap pairin g he ap還挺好寫的,不過並沒有傳說中那麼快 這裡沒有dec reas e ke ydecrease key d...

OI學習筆記 樹狀陣列

花了乙個上午,終於把樹狀陣列弄懂了。打了三種樹狀陣列的模板 樹狀陣列單點更新區間查詢,線段樹區間更新單點查詢,樹狀陣列區間更新區間查詢。第三種太毒了,好久才明白 就是樹一樣的陣列,它的底層實現其實就是乙個陣列,但是我們把它yy成了一棵樹。他的每一列的最頂端有乙個元素,而其他位置都是我們yy出來的,他...