題目大意:給定n個點,每乙個點有乙個權值,提供兩種操作:
1.將兩個點所在集合合併
2.將乙個點所在集合的最小的點刪除並輸出權值
非常裸的可並堆 n<=100w 啟示式合併不用想了
左偏樹就是快啊~
#include#include#include#include#define m 1001001using namespace std;
struct abcd*null=new abcd(0,0x3f3f3f3f),*tree[m];
abcd :: abcd(int x,int y)
abcd* merge(abcd *x,abcd *y)
int n,m;
int fa[m];
bool dead[m];
int find(int x)
void unite(int x,int y)
int main()
else
x=find(x);
printf("%d\n",tree[x]->score);
dead[tree[x]->pos]=1;
tree[x]=merge(tree[x]->ls,tree[x]->rs);}}
}
BZOJ1455 羅馬遊戲 左偏樹
題解 本題顯然可以用堆來實現,維護乙個大根堆 但是無法進行合併操作,於是我們想到左偏樹。定義乙個結點的斜深度為這個節點不斷向自己的右兒子走 直到為葉子節點的長度。左偏樹的 左偏 指左兒子的斜深度一定大於等於右兒子的斜深度。合併就簡單了,我們可以歸併的來維護乙個左偏樹,設需合併的兩個樹的根節點為 k1...
bzoj1455 羅馬遊戲 左偏樹
time limit 5 sec memory limit 64 mb submit status discuss 第一行乙個整數n 1 n 1000000 n表示士兵數,m表示總命令數。第二行n個整數,其中第i個數表示編號為i的士兵的分數。分數都是 0.10000 之間的整數 第三行乙個整數m 1...
BZOJ1455 羅馬遊戲 左偏樹
time limit 5 sec memory limit 64 mb submit 870 solved 347 submit status discuss 第一行乙個整數n 1 n 1000000 n表示士兵數,m表示總命令數。第二行n個整數,其中第i個數表示編號為i的士兵的分數。分數都是 0....