配對堆是一種可並堆(可以將兩個堆合併,且速度快),時間複雜度:
合併merge:o(1) 插入push:o(1) 彈出pop:o(logn)
配對堆不是二叉堆(我一開始不知道這個所以一直搞不懂)
配對堆存樹的方式不一樣,如圖,對於每個節點,有一條邊指向最左邊的兒子,一條指向他右邊的兄弟
和普通樹的對比:(靈魂畫圖)(藍色為普通方式,紅色為做兄弟右兒子)
以下均以大根堆為例
很簡單,比較兩樹樹根,將小的的根作為大的左兒子,然後將小的的根的右兄弟指為大的原來的左兒子
如圖:(根的值在點上)
直接將插入的點作為乙個堆,然後和原堆合併
把根斷開
從左到右依次兩兩合併,再從左到右依次合併,具體細節可參考**
#includeinlinevoid 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出來的,他...