かしのブログ

競技プログラミングとか

AtCoder Grand Contest 037 D - Sorting a Grid

問題

 N \times M行列 A, D (=\{D_{i, j} | D_{i, j} = M \times (i-1) + j\})が与えられる。次の操作を行って A Dに変換するとき、その途中経過である B, Cを1つ求める。

  1.  Aの行ごとに好きに並び替えて Bにする
  2.  Bの列ごとに好きに並び替えて Cにする
  3.  Cの行ごとに好きに並び替えて Dにする

atcoder.jp

考察

 Bの満たすべき条件を考える。 まず、 Dの要素は、それぞれの行ごとに同じ色がついているとみなす。 つまり、 r行目の要素 C_{r, j} (M\times (r-1) \lt C_{r, j} \leq M\times r)の色は \mathcal{c}_rである。  Cは、行の並び替えだけで Dになるために、 Cの各行も同じ色で、なおかつ、各列には、 N色の要素がそれぞれ1つずつ存在する。  B \rightarrow Cの変換では列ごとの要素が変わらないので、 Bはこの制約をみたす必要がある。

 B j列目について、 N行それぞれに N色を分配する方法を考える。  i行目に \mathcal{c}_rを入れられるかは、 A i行目に \mathcal{c}_rがあるかどうかで決まる。 そこで、行を表す N個の頂点と色を表す N個の頂点を持った 2N頂点のグラフを考え、 i行目に \mathcal{c}_rがあるなら、これらに対応する頂点同士に辺を張る。 これで、どの行にどの色を割り当てるかを、完全マッチングで決められる。 一度使った要素はその行から削除する。 ここで、次の補題(証明は後述)より、残りの列も同様に繰り返すことで要素を決めることができる。

制約を満たすような任意の M-m列の割り当てをおこなったとき、残りの m列も制約を満たすマッチングが存在する

以上で Bを構築できた。  C Bを列ごとに昇順に並べればよい。

証明

[補題]制約を満たすような任意の M-m列の割り当てをおこなったとき、残りの m列も制約を満たすマッチングが存在する

 m列残っているとき、各色 \mathcal{c}_iの要素もちょうど m色ずつ残っている。 それぞれの行について、要素が1つ以上存在するので、その行と辺を張った色が1つ以上存在する。 また、それぞれの色について、少なくとも1つ以上の行に入っているので、その色と辺を張った行が1つ以上存在する。 以上より、 N色に対して N行のマッチングがあるので、ホールの定理より、制約を満たすマッチングが存在する。

実装

atcoder.jp