ABC466 D - Placing Rooks
ルーク配置
考え方
コマの置き方のルールにより、各行・各列最大 $1$ つしかコマを置けない。
よって、各行「何列目にコマがあるか、またはどこにもないか」でコマ配置は十分表せる。
しかしこれでは問題がある。
これでは、ある列のコマを削除するのに、全ての行を見なければならない。
そこで、各列「何行目にコマがあるか、またはどこにもないか」も重ねて情報を持つことにする。
ここまで来れば、あとは問題通りにシミュレーションするだけである。
つまり、$1$ つの操作ごとに以下を処理すればよい。
- 指定行にコマがあるか確認し、あるなら両データからそのコマを削除
- 指定列にコマがあるか確認し、あるなら両データからそのコマを削除
- 指定マスのコマを追加し、両データに反映
$1$ 回の処理が $O(1)$ なので、事前処理も含めて全体の計算量は $O(N+M)$。
入力例1での動作
入力を受け取る。
n: 3
m: 6
r: {1, 1, 3, 3, 1, 1}
c: {1, 2, 3, 2, 3, 3}
最初は、どのマスにもコマがない。
各操作で削除されるコマと、操作後に残るコマは次のようになる。
| 操作 | 行側で削除 | 列側で削除 | 操作後のコマ |
|---|---|---|---|
| $(1,1)$ | なし | なし | $\{(1,1)\}$ |
| $(1,2)$ | $(1,1)$ | なし | $\{(1,2)\}$ |
| $(3,3)$ | なし | なし | $\{(1,2),(3,3)\}$ |
| $(3,2)$ | $(3,3)$ | $(1,2)$ | $\{(3,2)\}$ |
| $(1,3)$ | なし | なし | $\{(1,3),(3,2)\}$ |
| $(1,3)$ | $(1,3)$ | なし | $\{(1,3),(3,2)\}$ |
$4$ 回目の操作では、まず $3$ 行目から $(3,3)$ を削除する。
その後、$2$ 列目から $(1,2)$ を削除してから $(3,2)$ を置く。
$6$ 回目の操作では、$1$ 行目の $(1,3)$ を一度削除する。
この時点で $3$ 列目にはコマがないので、列側では何も削除せず、最後に $(1,3)$ を置き直す。
最終的に残るコマは $(1,3)$ と $(3,2)$ の $2$ 個なので、答えは $2$ となる。
注意点
特になし。
別解
特になし。