BZOJ 1455 羅馬遊戲 可並堆

2021-06-28 22:50:42 字數 794 閱讀 7006

給出n個人的權值,每次要求將兩隊人合成一堆,或者殺掉一堆人中的權值最小的那個人。問每次刪除的人的權值是多少。

就是可並堆,沒了。我挑最簡單的隨機堆寫的。

#include 

#include

#include

#include

#define max 1000010

using

namespace

std;

struct heap

heap() {}

}*heap[max],mempool[max],*c = mempool + 1;

heap *merge(heap *x,heap *y)

int points,asks;

int src[max];

bool killed[max];

char s[10];

int father[max];

int find(int x)

int main()

cin >> asks;

for(int x,y,i = 1; i <= asks; ++i)

else

int fx = find(x);

printf("%d\n",heap[fx]->val);

killed[heap[fx] - mempool] = true;

heap[fx] = merge(heap[fx]->son[0],heap[fx]->son[1]);}}

return

0;}

bzoj 1455 羅馬遊戲

link 羅馬遊戲 這道題 每次合併兩個集合 或者 每次找到某個集合中值最小的並且將其刪掉。發現直接主席樹 主席樹合併即可 但是這樣做過於不優美且 n leq 1000000 這樣做在常數上不優秀。我們考慮開堆 合併兩個堆?啟發式合併?nlog 2崩掉。那直接開斜堆 即左偏樹 或者說可並堆。這樣合併...

bzoj1455羅馬遊戲

bzoj1455羅馬遊戲 題意 維護資料結構支援合併和彈出最小值。n 1000000,m 100000 題解 可並堆,注意本題合併時要判斷兩個節點是否在同乙個堆中。本弱寫了左偏樹和斜堆,發現斜堆比左偏樹快,不知道為什麼,求神犇解答。1 include 2 include 3 include 4 de...

bzoj1455 羅馬遊戲

time limit 5 sec memory limit 64 mb submit 1526 solved 639 submit status discuss 第一行乙個整數n 1 n 1000000 n表示士兵數,m表示總命令數。第二行n個整數,其中第i個數表示編號為i的士兵的分數。分數都是 0...