配對堆模板

2021-08-29 23:40:59 字數 1719 閱讀 9548

配對堆是一種可並堆

題意:兩種操作,合併兩個堆或者查詢乙個堆的最小值,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

(log⁡n

)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...