有 n
nn 個小根堆,每個堆只有乙個數,進行兩種操作:
1 x y
將第 x,y
x,yx,
y 個數分別在的小根堆合併
2 x
輸出第 x
xx 個數所在的的堆的最小數,並將其刪除,有多個則刪除最先輸入的,若第 x
xx 個數已刪除,則輸出 −1-1
−1思路:左偏樹
#include
#include
#define ls s[x].son[0]
#define rs s[x].son[1]
#define maxn 100010
using
namespace std;
int n,m,t,x,y;
struct trees[maxn]
;// get 找的是下標為 x 的結點的根節點的下標
intget
(int x)
// 路徑壓縮,和並查集一樣的
// merge 是將兩個堆進行合併
intmerge
(int x,
int y)
// del 是刪除以 x 為下標的結點
void
del(
int x)
intmain()
while
(m--
)else
}return0;
}
洛谷P3377 模板 左偏樹(可並堆)
題目描述 如題,一開始有n個小根堆,每個堆包含且僅包含乙個數。接下來需要支援兩種操作 操作1 1 x y 將第x個數和第y個數所在的小根堆合併 若第x或第y個數已經被刪除或第x和第y個數在用乙個堆內,則無視此操作 操作2 2 x 輸出第x個數所在的堆最小數,並將其刪除 若第x個數已經被刪除,則輸出 ...
洛谷 P3377 模板 左偏樹(可並堆)
如題,一開始有 n 個小根堆,每個堆包含且僅包含乙個數。接下來需要支援兩種操作 1 x y 將第 x 個數和第 y 個數所在的小根堆合併 若第 x 或第 y 個數已經被刪除或第 x 和第 y 個數在用乙個堆內,則無視此操作 2 x 輸出第 x 個數所在的堆最小數,並將這個最小數刪除 若有多個最小數,...
洛谷P3377 模板 左偏樹(可並堆)
如題,一開始有n個小根堆,每個堆包含且僅包含乙個數。接下來需要支援兩種操作 操作1 1 x y 將第x個數和第y個數所在的小根堆合併 若第x或第y個數已經被刪除或第x和第y個數在用乙個堆內,則無視此操作 操作2 2 x 輸出第x個數所在的堆最小數,並將其刪除 若第x個數已經被刪除,則輸出 1並無視刪...