可並堆 左偏樹

2021-09-29 15:26:35 字數 1149 閱讀 7075

題目描述

如題,一開始有n個小根堆,每個堆包含且僅包含乙個數。接下來需要支援兩種操作:

操作1: 1 x y 將第x個數和第y個數所在的小根堆合併(若第x或第y個數已經被刪除或第x和第y個數在用乙個堆內,則無視此操作)

操作2: 2 x 輸出第x個數所在的堆最小數,並將其刪除(若第x個數已經被刪除,則輸出-1並無視刪除操作)

輸入格式

第一行包含兩個正整數n、m,分別表示一開始小根堆的個數和接下來操作的個數。

第二行包含n個正整數,其中第i個正整數表示第i個小根堆初始時包含且僅包含的數。

接下來m行每行2個或3個正整數,表示一條操作,格式如下:

操作1 : 1 x y

操作2 : 2 x

輸出格式

輸出包含若干行整數,分別依次對應每乙個操作2所得的結果。

輸入輸出樣例

輸入 #1複製

5 51 5 4 2 3

1 1 5

1 2 5

2 21 4 2

2 2輸出 #1複製12

就是一些堆的合併,於是我們可以用到左偏樹。

寫法和無旋treap差不多。

然後並查集表示當前塊的位置,找到對應的堆的頂點。

ac**:

#pragma gcc optimize(2)

#include

//#define int long long

using namespace std;

const

int n=

1e5+10;

int ch[n][2

],val[n]

,dis[n]

,f[n]

,n,m;

intfind

(int x)

intmerge

(int x,

int y)

inline

void

pop(

int x)

signed

main()

else}}

return0;

}

左偏樹(可並堆)

左偏樹其實是一種可並堆,它可以 o log2 n o l og2n 合併兩個堆。那左偏?也就是說他左邊肯定有什麼東西比右邊大 別著急,在左偏樹上有乙個叫距離的東西 個點的距離,被定義為它子樹中離他最近的外節點到這個節點的距離 這與樹的深度不同 其中我們定義乙個節點為外節點,當且僅當這個節點的左子樹和...

可並堆 左偏樹 斜堆

經典的二叉堆已經可以在 o log n 的複雜度的情況下維護堆這樣的資料結構,也有d 堆可以維護成 o log d n 雖然pop操作的複雜度是 o d log d n 然而這兩種堆不能滿足 o log n 的合併操作,它們的經常是 o n log n 即每次將乙個堆中的堆頂拿出來放到另乙個堆裡。雖...

左偏樹 可並堆 模板

我想您應該會二叉堆吧,它包含三個操作,這裡與小根堆為例 1 查詢最小值 2 彈出最小值 3 插入乙個值 可以使用st l 的pr iori ty que ue實現,也可以用pb ds中的庫實現,當然也可以手寫反正我不會,筆者是用的系統堆 包含在庫al gori thm include include...