bzoj1455羅馬遊戲

2022-03-18 10:54:53 字數 761 閱讀 2563

bzoj1455羅馬遊戲

題意:維護資料結構支援合併和彈出最小值。n≤1000000,m≤100000

題解:可並堆,注意本題合併時要判斷兩個節點是否在同乙個堆中。本弱寫了左偏樹和斜堆,發現斜堆比左偏樹快,不知道為什麼,求神犇解答。

**:

1 #include 2 #include 3 #include 4

#define inc(i,j,k) for(int i=j;i<=k;i++)

5#define maxn 1000010

6using

namespace

std;

78 inline int

read()

11while(ch>='

0'&&ch<='

9')x=x*10+ch-'

0',ch=getchar();

12return f*x;13}

14int ch[maxn][2],v[maxn],fa[maxn]; bool

die[maxn];

15int find(int x)

16int merge(int x,int

y)20

void pop(int

x)23

int n,m; char opt[3

];24

intmain()

32if(opt[0]=='k'

)36}37

}38return0;

39 }

20160810

bzoj 1455 羅馬遊戲

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

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

BZOJ1455 羅馬遊戲 左偏樹

題解 本題顯然可以用堆來實現,維護乙個大根堆 但是無法進行合併操作,於是我們想到左偏樹。定義乙個結點的斜深度為這個節點不斷向自己的右兒子走 直到為葉子節點的長度。左偏樹的 左偏 指左兒子的斜深度一定大於等於右兒子的斜深度。合併就簡單了,我們可以歸併的來維護乙個左偏樹,設需合併的兩個樹的根節點為 k1...