bzoj 1455 羅馬遊戲

2022-02-05 04:40:22 字數 861 閱讀 5873

link:羅馬遊戲

這道題 每次合併兩個集合 或者 每次找到某個集合中值最小的並且將其刪掉。

發現直接主席樹+主席樹合併即可 但是這樣做過於不優美且\(n\leq 1000000\)這樣做在常數上不優秀。

我們考慮開堆 合併兩個堆?啟發式合併?nlog^2崩掉。

那直接開斜堆 即左偏樹 或者說可並堆。這樣合併常數小 且是log的。

外面套乙個並查集即可。

簡單複習一下左偏樹的幾個性質。

每個節點一般有5個元素 左兒子 右兒子 權值 編號 距離。是乙個二叉樹。

如果維護的是小根堆的話 顯然 父親比兒子權值小。

距離的定義是 離葉子節點的最近距離。

由於是左偏樹 所以左兒子距離大於等於右兒子距離。

所以父親距離由右兒子提供。

樹高log 合併log。插入 log。

code:

const int maxn=1000010;

int n,m,ans;

int f[maxn],vis[maxn],d[maxn];

char a[2];

struct wy

t[maxn];

inline int getfather(int x)

inline int merge(int x,int y)

inline void k(int x)

int main()

,f[i]=i;

get(m);

rep(1,m,i)

else

int xx=getfather(x);

k(xx);put(ans);

} }return 0;

}

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

BZOJ1455 羅馬遊戲 左偏樹

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