羅馬遊戲(左偏樹)

2022-05-11 15:54:05 字數 752 閱讀 2148

左偏樹模板題。

只不過這裡要加上並查集的路徑壓縮(因為要找堆頂),不然複雜度是錯的。

因為乙個人被殺了,他就沒了,為了證明他沒了,所以要把他的val設成-1。

#include #include 

using

namespace

std;

const

int n = 1000010

;struct

leftist_treet[n];

int merge(int x, int

y) t[x].rson =merge(t[x].rson, y);

if (t[t[x].rson].dist >t[t[x].lson].dist)

t[t[x].lson].fa = t[t[x].rson].fa = t[x].fa =x;

t[x].dist = t[x].dist + 1

;

returnx;}

intget(int

x) void pop(int

x) int

n, m, a[n];

intmain()

scanf("%d

", &m);

while (m--)

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