題目描述
有 n
nn 種美酒,第 i
ii 種美酒有 a
ia_i
ai 兩(即 ai10
\frac
10ai
公升)。有 m
mm 條好漢,第 i
ii 位最多能喝 b
ib_i
bi 兩酒,但是沒有人會喝某一種酒超過 1
11 兩。由於酒杯容積是 1
11 兩,喝酒也只能喝 k(k
∈n
)k(k\in\n)
k(k∈n)
兩。為了不引起紛爭,要求酒被喝完,但是人不一定要喝醉,甚至可以不喝。
有時候,人的酒量會有 1
11 兩的變化,或者某種酒的量有 1
11 兩的變化。你需要回答,是否存在一種方案。
資料範圍與提示
n ≤1
05,q
≤105
n\le 10^5,\;q\le 10^5
n≤105,
q≤10
5 。考慮網路流,源點連出 a
ia_i
ai 容量的邊,匯點連入 b
ib_i
bi 容量的邊,中間的邊容量均為 1
11,問題轉化為最大流是否是 ∑ai
\sum a_i
∑ai
。跑最大流肯定不行,考慮手算最小割。設割為 cut
(s,t
)cut(s,t)
cut(s,
t),即與源點直接相連的點中 s
ss 集合為 s
ss 部,與匯點直接相連的點中 t
tt 集合為 t
tt 部,則割的容量為
∣ s∣
⋅∣t∣
+∑i∉
sai+
∑i∉t
bi
|s|\cdot |t|+\sum_a_i+\sum_b_i
∣s∣⋅∣t
∣+i∈
/s∑
ai
+i∈/
t∑
bi
第一項是容量為 1
11 的邊的數量嘛。顯然 s,t
s,ts,
t 應當選最大的 ai,
bi
a_i,b_i
ai,bi
(求最小割嘛)。
不妨固定 s
ss 那麼 b
bb 放入 t
tt 則貢獻 ∣s∣
|s|∣s
∣ 否則貢獻 b
ib_i
bi 。所以 b
bb 的貢獻是 min(
∣s∣,
bi
)\min(|s|,b_i)
min(∣s
∣,bi
)。現在考慮 a,b
a,ba,
b 的變化。由於變化只有 1
11 ,所以大小順序不會變。線段樹維護每種 ∣s∣
|s|∣s
∣ 對應的最小值,那麼 a
ia_i
ai 的變化會導致 ∣s∣
≤n−i
|s|\le n-i
∣s∣≤n−
i 的值變化(不妨設 a
aa 是從小到大排序的)而 b
ib_i
bi 的變化會導致 ∣s∣
≥b
i|s|\ge b_i
∣s∣≥bi
的值變化。線段樹可以維護。
複雜度 o(n
logn)
\mathcal o(n\log n)
o(nlogn)
。