Official

F - Charge Editorial by KoD


この問題は最小費用流として定式化することができます。

\(B_i\) が降順となるように給水器を並べ替えておきます。最短路反復のアルゴリズムを適用すると、「順番に給水器を見ていき、できるだけ給水する(=フローを流せるだけ流す)」という処理を繰り返すことで最適解を求められることがわかります。

\(k\) について給水器 \(1, \dots, k\) のみを使った場合の最大給水量を求め、この値の差分と \(B_i\) との積を足し合わせるとでこの問題を解くことができます。 計算量は \(O(N^2 \log N)\) です。

最大の給水量を求める方法は blackyuki さんの解説 を参照してください。

実装例 (C++)

posted:
last update: