BZOJ1455 羅馬遊戲 左偏樹

2021-08-08 00:09:42 字數 1032 閱讀 9243

題解:

本題顯然可以用堆來實現,(維護乙個大根堆),但是無法進行合併操作,於是我們想到左偏樹。

定義乙個結點的斜深度為這個節點不斷向自己的右兒子走 直到為葉子節點的長度。左偏樹的「左偏」指左兒子的斜深度一定大於等於右兒子的斜深度。合併就簡單了,我們可以歸併的來維護乙個左偏樹,設需合併的兩個樹的根節點為 k1 k2,那麼我們可以先將以 k1 為根節點的右子樹和 k2 那個子樹合併,再不斷調整即可。

ps:陣列一定要開大,重要的事情說一遍!我因此re 4次!

**:

#include 

#include

#include

#include

#include // stl

#include

#include

#include

#include

#define mpr make_pair

#define debug() puts("okkkkkkkk")

using

namespace

std;

typedef

long

long ll;

const

int inf = 1

<< 26;

struct trees t[1000005];

int n, q;

int fa[1000005], die[1000005];

int find(int x)

int merge(int k1, int k2)

int main()

} else

if(ch[0] == 'k')

int temp = find(x); die[temp] = 1;

printf("%d\n", t[temp].w);

fa[temp] = merge(t[temp].l, t[temp].r);

fa[fa[temp]] = fa[temp];}}

return

0;}

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

BZOJ 1455 羅馬遊戲 左偏樹

題目大意 給定n個點,每乙個點有乙個權值,提供兩種操作 1.將兩個點所在集合合併 2.將乙個點所在集合的最小的點刪除並輸出權值 非常裸的可並堆 n 100w 啟示式合併不用想了 左偏樹就是快啊 include include include include define m 1001001 usin...

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