AtCoder Beginner Contest 298 F問題 Rook Score
問題
提出解答
問題の概要
行 列からなるマス目があり, 上から 行目, 左から 列目のマスを と書くことにする.
に対して, には正の整数 が, それ以外の 個のマスには が書かれている.
以上 以下の整数の組 を選び, 列目または 行目である 個のマスにかかれている整数の総和を とする.
として考えられる最大値を求めよ.
制約
解法 1 (座標圧縮)
列目または 行目である 個のマスにかかれている整数の総和 のことを と書くことにする.
ここで, 行目にのマス書かれている 個の整数の総和を , 列目にのマス書かれている 個の整数の総和を , に書かれている整数を と書くことにすると,
が成り立つ.
ここで, 制約から であるので, を最大にするような選び方で となるような の選び方が存在する. 同様にして, であるような選び方も存在する.
よって, 最初から については であるようなものについて制限してもよい.
また, 必要ならば行 (列) の削除と行 (列) 番号の付け直しを行うことにより, 行 列の問題であるとしてもよい. これ以降ではそれを仮定する.
解法 2 (方針)
の選び方を場合分けする. を固定する. このとき, 次のようにすることで を固定した場合の最大値を求めることができる.
- であるような 全てに対して を計算する.
- 上での計算の として登場しなかった全ての に対して, であることに注意して, の最大値を求める.
解法 3 (高速化)
この計算は次のようにして計算できる.
- 多重集合 を用意し, とする.
- の順に行う (なお計算するには最大値の判定も含めることにする).
- であるような 全体の集合を とする. 各 に対して, を計算し, から を削除する.
- を計算する.
- 各 に対して, に 追加する.
- 最大値を返す.
この の管理としては順序付き集合やセグメントツリーを利用することによって, 全体で 時間で計算できる.