AtCoder Regular Contest 153 B問題 Grid Rotations
問題
提出解答
問題の概要
縦 行, 横 列のグリッドがある. 上から 行目, 左から 列目には英小文字 が書かれている.
このグリッドに対して, 回の操作を行う. 番目の操作は整数 を用いて次のようにする.
- グリッドを次のように つの長方形の領域に分割する.
- 上から 行, 左から 列の部分を とする.
- 上から 行, 右から 列の部分を とする.
- 下から 行, 左から 列の部分を とする.
- 下から 行, 右から 列の部分を とする.
- を 度回転する.
回の操作後, グリッドはどのようになるか?
制約
- は英小文字
解法
まず, 操作について, 初期状態で同じ行にあるマスはどんなに操作しても操作後は必ず同じ行にある. 列についても同様である. よって, に対して, 初期状態で 行目にあるマスが最終的に何行目に映るかどうかを調べれば良い. 列についても同様である.
このことから, 行と列独立で考えれば良い.
以降では次の問題を考える.
に対して, 次の操作を 回行った後の列を求めよ.
- 左から 項, 右から 項をそれぞれ反転させる.
このとき, 各操作について, 隣接関係を先頭と末尾についても隣接しているとみなすと, 各操作について以下が従う.
- 項について, 操作後に隣接しているための必要十分条件は操作前に隣接していることである.
- このとこから, は常に隣接していることがわかるが, の左右関係は必ず反転する.
よって, の左右関係は の偶奇から直ちに分かるので, の場所を特定できれば良い.
元々 項目に合った要素が 番目の操作後には
項目にある.
以上のから, 操作後において各行と各列が元々何行目, 何列目であったかを求めることができるので, 最終的にはそこから解答を求めれば良い.
計算量は 時間である.