少则无味多则醉

题目

题目描述
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

跑最大流肯定不行,考虑 手算最小割。设割为 C U T ( S , T ) CUT(S,T) CUT(S,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)

你可能感兴趣的:(C++,数据结构,网络流)