hiho1160 攻城略地

2022-08-16 14:30:14 字數 850 閱讀 9654

題意:給出乙個圖,每個點有乙個權值,破壞這個點需要花費這個點的權值,你的任務是破壞所有的點,若破壞某個點之前它的相鄰點已經被破壞,那麼它就不需要花費代價,求破壞所有點的最小代價

題解:帶權並查集

破壞乙個點後,則這個點所在連通塊的所有點就會被破壞,那麼每個連通塊都破壞其代價最小的點

若破壞的邊不足k,則從小到大破壞其他的點

/*

attack

*/#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

const

int n = 1000010

;int

w[n],fa[n],q[n],v[n];

intgi()

int find(int

x) int

main()

if(w[xx]>w[yy]) swap(xx,yy);

w[yy]=w[xx],fa[yy]=xx;

}ll ans=0

;

for(int i=1; i<=n; i++)

sort(q+1,q+cnt+1

);

for(int i=1; i<=k; i++) ans+=q[i];

printf(

"case #%d: %lld\n

", ++tot,ans);

} return0;

}

YbtOJ 763 攻城略池

設 f x 是點 x 被攻占的時間。顯然這個值可以二分,然後枚舉子樹內的每乙個點,計算在二分到的時間內從列舉到的點可以過去多少人。在 mid 時間內會被攻占當且僅當 d x leq sum x max mid f y text y text x 0 c times mid v 然後往上的時候線段樹合...

YbtOJ 763 攻城略池 線段樹合併

給出n nn個點的一棵樹,每個di 0d i 0 di 0的點每秒會產生乙個士兵往根節點走,走到乙個節點讓乙個節點d id i di 減一 為0 00就不管 求需要多久才能讓所有點的d dd值變為000 1 n 105 1 d i 10 81 leq n leq10 5,1 leq d i leq ...

YbtOJ 763 攻城略池 線段樹合併

給出 n 個點的一棵樹,每個 d i 0 的點每秒會產生乙個士兵往根節點走,走到乙個節點讓乙個節點 d i 減一 為 0 就不管 求需要多久才能讓所有點的 d 值變為 0 1 leq n leq10 5,1 leq d i leq 10 8 考慮求出每個點 d i 值變成 0 的時間 t i 對於乙...