問題へのリンク

https://atcoder.jp/contests/arc125/tasks/arc125_e

経緯

ARC125 には参加できなかったので,バーチャルコンテストで解きました. Cまでしか解けなかったので,バーチャルコンテスト終了後に考えましたが, 全然解けませんでした.フローは考えたのですが,間に合うはずがない (それは正しい) と思って,そこから先には進めませんでした.

問題概要

正の整数列 $(A_i \mid i \in [1, N]), (B_j \mid j \in [1, M]), (C_j \mid j \in [1, M]) $ が与えられる. $(D_{ij} \mid i \in [1, N], j \in [1, M])$ を次を満たすように取るとき, $\sum \{ D_{ij} \mid i \in [1, N], j \in [1, M] \}$ の最大値を求めよ.

  • $\sum \{ D_{ij} \mid j \in [1, M] \} \leq A_i$
  • $D_{ij} \leq B_j$
  • $\sum \{ D_{ij} \mid i \in [1, N] \} \leq C_j$

制約: $N, M \leq 2\times 10^5$, $A_i, C_j \leq 10^{12}$, $B_j \leq 10^7$

解法

次のフローの最大流問題として定式化できる.

  • Source $\to L_i$ 容量 $A_i$
  • $L_i \to R_j$ 容量 $B_j$
  • $R_j \to$ Sink 容量 $C_j$

容量が大きくノードが多いので,Dinic などでは解けない.

最小カット $(A, B)$ を求める.Source $\in A$ とする. $L_i$ たちのうち,$A$ に属するものの集合を $X$, $|X| = n$ とする. $R_j$ については,

  • $R_j \in A$ とすると,カット容量への寄与は $C_j$
  • $R_j \in B$ とすると,カット容量への寄与は,$n B_j$

であるから,$(A, B)$ の最小性より,

  • $C_j < n B_j$ なら $R_j \in A$
  • $C_j > n B_j$ なら $R_j \in B$

となる必要がある.カット容量は全体として,

$$ \sum \{ A_i \mid i \in [1, N] - X \} + \sum \{ \min(C_j, n B_j) \mid j \in [1, M] \} $$

であるから,$A_i$ の大きい方から $n$ 個が $X$ に属するとして良い. $n = 1, \ldots, N$ について計算して最小値を取れば良い.

ACコード

https://atcoder.jp/contests/arc125/submissions/25313748