題目大意:有$n$個數,$m$個操作:
$1\;x\;y:$把第$x$個數和第$y$個數所在的小根堆合併
$2\;x:$輸出第$x$個數所在的堆的最小值
題解:左偏樹,保證每個的左兒子的距離大於右兒子(距離的定義是該點到其子樹中最近的葉子節點的距離)
卡點:無
c++ code:
#include #include #define maxn 100010int n, m;
int val[maxn];
int fa[maxn], lc[maxn], rc[maxn], dis[maxn];
inline int find(int x)
int merge(int x, int y)
int pop(int x)
int main() else
} return 0;
}
洛谷P3377 模板 左偏樹(可並堆)
題目描述 如題,一開始有n個小根堆,每個堆包含且僅包含乙個數。接下來需要支援兩種操作 操作1 1 x y 將第x個數和第y個數所在的小根堆合併 若第x或第y個數已經被刪除或第x和第y個數在用乙個堆內,則無視此操作 操作2 2 x 輸出第x個數所在的堆最小數,並將其刪除 若第x個數已經被刪除,則輸出 ...
洛谷 P3377 模板 左偏樹(可並堆)
有 n nn 個小根堆,每個堆只有乙個數,進行兩種操作 1 x y將第 x,y x,yx,y 個數分別在的小根堆合併 2 x輸出第 x xx 個數所在的的堆的最小數,並將其刪除,有多個則刪除最先輸入的,若第 x xx 個數已刪除,則輸出 1 1 1思路 左偏樹 include include def...
洛谷 P3377 模板 左偏樹(可並堆)
如題,一開始有 n 個小根堆,每個堆包含且僅包含乙個數。接下來需要支援兩種操作 1 x y 將第 x 個數和第 y 個數所在的小根堆合併 若第 x 或第 y 個數已經被刪除或第 x 和第 y 個數在用乙個堆內,則無視此操作 2 x 輸出第 x 個數所在的堆最小數,並將這個最小數刪除 若有多個最小數,...