[BZOJ 4973] 比特战争 题解

本文介绍了BZOJ 4973题目的解题思路,主要探讨连通分量的占领策略。通过最小生成树分析,发现最优解存在一种构造方式,即每个联通块最多只包含一条最小边。解决方案采用贪心策略,按边权重从小到大枚举,更新最优解,同时维护两个关键值以计算打通联通块的最小成本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值