少则无味多则醉

137 篇文章 1 订阅
27 篇文章 0 订阅

题目

题目描述
n n n 种美酒,第 i i i 种美酒有 a i a_i ai 两(即 a i 10 \frac{a_i}{10} 10ai 升)。有 m m m 条好汉,第 i i i 位最多能喝 b i b_i bi 两酒,但是没有人会喝某一种酒超过 1 1 1 两。由于酒杯容积是 1 1 1 两,喝酒也只能喝 k ( k ∈ N ) k(k\in\N) k(kN) 两。为了不引起纷争,要求酒被喝完,但是人不一定要喝醉,甚至可以不喝。

有时候,人的酒量会有 1 1 1 两的变化,或者某种酒的量有 1 1 1 两的变化。你需要回答,是否存在一种方案。

数据范围与提示
n ≤ 1 0 5 ,    q ≤ 1 0 5 n\le 10^5,\;q\le 10^5 n105,q105

思路

考虑网络流,源点连出 a i a_i ai 容量的边,汇点连入 b i b_i bi 容量的边,中间的边容量均为 1 1 1,问题转化为最大流是否是 ∑ a i \sum a_i ai

跑最大流肯定不行,考虑 手算最小割。设割为 C U T ( S , T ) CUT(S,T) CUT(S,T),即与源点直接相连的点中 S S S 集合为 S S S 部,与汇点直接相连的点中 T T T 集合为 T T T 部,则割的容量为
∣ S ∣ ⋅ ∣ T ∣ + ∑ i ∉ S a i + ∑ i ∉ T b i |S|\cdot |T|+\sum_{i\notin S}a_i+\sum_{i\notin T}b_i ST+i/Sai+i/Tbi

第一项是容量为 1 1 1 的边的数量嘛。显然 S , T S,T S,T 应当选最大的 a i , b i a_i,b_i ai,bi(求最小割嘛)。

不妨固定 S S S 那么 b b b 放入 T T T 则贡献 ∣ S ∣ |S| S 否则贡献 b i b_i bi 。所以 b b b 的贡献是 min ⁡ ( ∣ S ∣ , b i ) \min(|S|,b_i) min(S,bi)

现在考虑 a , b a,b a,b 的变化。由于变化只有 1 1 1 ,所以大小顺序不会变。线段树维护每种 ∣ S ∣ |S| S 对应的最小值,那么 a i a_i ai 的变化会导致 ∣ S ∣ ≤ n − i |S|\le n-i Sni 的值变化(不妨设 a a a 是从小到大排序的)而 b i b_i bi 的变化会导致 ∣ S ∣ ≥ b i |S|\ge b_i Sbi 的值变化。线段树可以维护。

复杂度 O ( n log ⁡ n ) \mathcal O(n\log n) O(nlogn)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值