BZOJ1455 羅馬遊戲 左偏樹

2022-08-03 13:45:16 字數 1068 閱讀 3457

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..10000]之間的整數) 第三行乙個整數m(1<=m<=100000) 第3+i行描述第i條命令。命令為如下兩種形式: 1. m i j 2. k i

如果命令是kill,對應的請輸出被殺人的分數。(如果這個人不存在,就輸出0)

5100 90 66 99 10

7m 1 5

k 1k 1

m 2 3

m 3 4

k 5k 4

10100066

今天學了一下可並堆的左偏樹實現。

以下來自hzwer:

左偏樹的性質:

1.【堆性質】:節點的關鍵字大等於其兒子節點的關鍵字

2.【左偏性質】:定義節點到最近的葉節點的距離為節點距離,任意節點的左兒子的距離大於右兒子的距離

左偏樹在實現插入操作時總是從右側插入,也就是總是讓短的一側生長,如果右側長於左側,那麼交換左右側,繼續從右側生長

學完就發現這是裸題了……還是挺好實現的,效率也不錯。

#include#define n 1000005

using

namespace

std;

intn,m,fa[n],l[n],r[n],d[n],v[n];

bool

die[n];

char ch[10

];inline

intread()

while (c>='

0'&&c<='

9')

return a*f;

}int find(int x)

int merge(int x,int

y)int

main()

}else}}

return0;

}

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

BZOJ 1455 羅馬遊戲 左偏樹

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