bzoj [Lydsy1708月赛]比特战争
其实不是那么想写,但是这题毕竟困扰了我很久,还是动笔了,可能笔者自己也没有很懂,希望大家能谅解一下。本文仅仅是自己的想法罢了。
对于一个连通分量我们可以考虑两种形式也就是要么其自己内部占领,要么是外面来的士兵占领。
如果是外面来的士兵肯定贪心得选取最小的边。
对于最小的边我们不妨考虑一下最小生成树,如果一个连通分量在最终情况下是被外部占领的,那么肯定是选择一个最下的边。如果其不被占领肯定又是一个子问题。
这里通过观察可以得到一个结论,对于最优的答案存在一种构造方案使得对于一个联通块至多只有最小的边被加入。
对于一个联通块如果是被别人占领显然是加入最小的边。
如果其是内部占领之后和其相邻的所有边都不会因为要占领这个联通块而被加入。
我们直接贪心枚举每条边的加入情况即可。
我们不妨考虑从小到大加边,每次更新答案。对于两个联通块其打通的最小花费是 max ( max ( w , b v ) , b u ) × min ( a u , a v ) \max(\max(w, b_v), b_u) \times \min(a_u, a_v) max(max(w,bv),bu)×min(au,av)。我们维护两个值即可。
#include <bits/stdc++.h>
using namespace std;
//#define Fread
//#define Getmod
#ifdef Fread
char buf[1 << 21], *iS, *iT;
#define gc() (iS == iT ? (iT = (iS = buf) + fread (buf, 1, 1 << 21, stdin), (iS == iT ? EOF : *iS ++)) : *iS ++)
#define getchar gc
#endif // Fread
template <