題意:給出乙個圖,每個點有乙個權值,破壞這個點需要花費這個點的權值,你的任務是破壞所有的點,若破壞某個點之前它的相鄰點已經被破壞,那麼它就不需要花費代價,求破壞所有點的最小代價
題解:帶權並查集
破壞乙個點後,則這個點所在連通塊的所有點就會被破壞,那麼每個連通塊都破壞其代價最小的點
若破壞的邊不足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 對於乙...