配對堆是一種可並堆
題意:兩種操作,合併兩個堆或者查詢乙個堆的最小值,n≤1
06
n\leq 10^6
n≤106pai
ring
−hea
ppairing-heap
pairin
g−he
ap還挺好寫的,不過並沒有傳說中那麼快
這裡沒有dec
reas
e−ke
ydecrease-key
decrea
se−k
ey的**,說一下大概怎麼實現
額外記錄乙個fat
he
rfather
father
域,執行dec
reas
e−ke
ydecrease-key
decrea
se−k
ey的時候,把該節點x
xx的子樹抽出來(只是將fat
herx
father_x
father
x設為0
00而不變動fat
herx
father_x
father
x的結構)
讓後和根節點合併,當pop
−min
pop-min
pop−mi
n的時候,如果發現乙個兒子的fat
he
rfather
father
不是自己那麼就不把他加入合併的佇列中,這樣不影響時間複雜度
時間複雜度,除了pop
−min
pop-min
pop−mi
n都是o(1
)o(1)
o(1)
的,p op
−min
pop-min
pop−mi
n應該是均攤o
(logn
)o(\log\ n)
o(logn
)這玩意比左偏樹還好寫,也比左偏樹快
#include
#define n 1000010
#define mid (l+r>>1)
using
namespace std;
int n,m,b[n]
,c,f[n]
,d[n]
,rt[n]
;struct tree s[n]
;inline
intgf
(int x)
inline
intmerge
(int x,
int y)
inline
intcdq
(int l,
int r)
inline
intpop
(int x)
intmain()
; rt[i]
=f[i]
=i;}
for(
int o,x,y;m--;)
x=gf(x)
;printf
("%d\n"
,s[rt[x]
].v)
; d[s[rt[x]
].x]=1
; rt[x]
=pop
(rt[x]);
}else}}
}
資料結構 配對堆
題目描述 如題,初始小根堆為空,我們需要支援以下3種操作 操作1 1 x 表示將x插入到堆中 操作2 2 輸出該小根堆內的最小數 操作3 3 刪除該小根堆內的最小數 輸入輸出格式 輸入格式 第一行包含乙個整數n,表示操作的個數 接下來n行,每行包含1個或2個正整數,表示三種操作,格式如下 操作1 1...
OI學習筆記 配對堆
配對堆是一種可並堆 可以將兩個堆合併,且速度快 時間複雜度 合併merge o 1 插入push o 1 彈出pop o logn 配對堆不是二叉堆 我一開始不知道這個所以一直搞不懂 配對堆存樹的方式不一樣,如圖,對於每個節點,有一條邊指向最左邊的兒子,一條指向他右邊的兄弟 和普通樹的對比 靈魂畫圖...
堆操作模板
include include using namespace std const int n 1e5 10 int h n ph n hp n n,cnt,m cnt表明現在容器中總的元素個數 可以作為容器末尾元素的指標 m記錄當前所使用元素的序號 p理解為pointer指標 h理解為heap p...