题目
题目描述
有
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(k∈N) 两。为了不引起纷争,要求酒被喝完,但是人不一定要喝醉,甚至可以不喝。
有时候,人的酒量会有 1 1 1 两的变化,或者某种酒的量有 1 1 1 两的变化。你需要回答,是否存在一种方案。
数据范围与提示
n
≤
1
0
5
,
q
≤
1
0
5
n\le 10^5,\;q\le 10^5
n≤105,q≤105 。
思路
考虑网络流,源点连出 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
∣S∣⋅∣T∣+i∈/S∑ai+i∈/T∑bi
第一项是容量为 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 ∣S∣≤n−i 的值变化(不妨设 a a a 是从小到大排序的)而 b i b_i bi 的变化会导致 ∣ S ∣ ≥ b i |S|\ge b_i ∣S∣≥bi 的值变化。线段树可以维护。
复杂度 O ( n log n ) \mathcal O(n\log n) O(nlogn) 。