BZOJ 1455 羅馬遊戲 左偏樹

2022-08-02 15:00:35 字數 638 閱讀 8096

題目大意:給定n個點,每乙個點有乙個權值,提供兩種操作:

1.將兩個點所在集合合併

2.將乙個點所在集合的最小的點刪除並輸出權值

非常裸的可並堆 n<=100w 啟示式合併不用想了

左偏樹就是快啊~

#include#include#include#include#define m 1001001

using 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....