AtCoder Beginner Contest 273 D問題 LRUD Instructions
問題
提出解答
問題の概要
縦 行, 横 列のマス目がある. 上から 行目, 左から 列目のマス目をマス と呼ぶことにする.
個のマス は壁のマスであり, 残りの 個のマスには何もない.
最初, マス にいる.
次の行動を の順に行う. 回目の行動は のうちのどれかである文字 と整数 で表される.
なお, はそれぞれ左, 右, 上, 下を表すことにする.
- 現在いるマスに対して, の向きに壁ではないマスが隣接していればそのマスに移動する. それ以外では何もしない. この行動を 回繰り返す.
に対して, 回目の行動終了後にいるマスを求めよ.
制約
- は全て異なる.
- は のどれか.
解法
左向きの移動について考える. 残りの向きの移動についても同様である.
今, マス にいるとする. このとき, 行目にある壁のマスの列番号を昇順に並べた列を とする. このとき, を追加することにより, の中に 以下で最大の整数 を求めることができる. このとき, 移動する回数 は
- ならば,
- ならば,
である. このときの移動後のマスは である.
よって, 各列, 各行ごとに壁のあるマスをまとめ, 移動の際には二分探索によって移動する向きにおいて最も近い壁マスを見つけて, 可能な移動回数を求め, 移動させればよい.
計算量は 時間である.