題目鏈結
左偏樹的模板題,參考左偏樹學習筆記
對於這道題我是用乙個並查集維護出了哪些點是在同一棵樹上,也可以直接log的往上跳尋找根節點
#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
const int n = 100000 + 100;
inline char nc()
inline int read()
while(c>='0'&&c<='9')
return x*f;
}int a[n],pop[n],col[n];
int n,m;
int ch[n][2],dist[n],fa[n];
int find(int x)
void uni(int x,int y)
int merge(int x,int y)
inline void work1()
inline void work2()
int k = find(x);
int y = col[k];
printf("%d\n",a[y]);
pop[y] = 1;
int now = merge(ch[y][0],ch[y][1]);
col[k] = now;
ch[y][0] = ch[y][1] = 0;
}int main()
while(m--)
return 0;
}
目標不一定要說出來,去實現它就好。 ——屈屈, Luogu3377 模板 左偏樹(可並堆)
題面戳我 題目描述 如題,一開始有n個小根堆,每個堆包含且僅包含乙個數。接下來需要支援兩種操作 操作1 1 x y 將第x個數和第y個數所在的小根堆合併 若第x或第y個數已經被刪除或第x和第y個數在用乙個堆內,則無視此操作 操作2 2 x 輸出第x個數所在的堆最小數,並將其刪除 若第x個數已經被刪除...
luogu P3377 左偏樹(可並堆)
傳送門 左偏樹 左偏!也就是下面這種左邊大,右邊小的樹 可並堆 可以合併的堆 堆 維護最值的資料結構 核心 細節 先來 int merge int x,int y 在合併時,往右子樹走,當發現右邊的值不合法時,則另另乙個堆的值來swap 以最大值為例 當發現x每次合併完之後更新高度 乙個節點的高度 ...
洛谷 3377 模板 左偏樹(可並堆)
題目傳送門 作為乙個合格的蒟蒻,我們當然在學每一種演算法後都要去做一些和這種演算法有關的模板題。毫無疑問,這是一道左偏樹的模板題。伏地膜大佬,這位大佬對左偏樹的解釋十分到位。左偏樹就是在堆的基礎上加上了距離的概念。距離指的是每乙個節點到離他最近的不滿節點的距離。若乙個節點的左兒子或右兒子為空,則該節...