Strorkisのブログ

信憑性については悪しからず

ARC104 C - Fair Elevator

問題

C - Fair Elevator

解法

まず、各階に、乗った階が指定されている場合は Lを、降りた階が指定されている場合は Rをマークする( L Rは階数と被らない何かしらの数)。 ただし、どちらも指定されている場合は、乗った階に降りた階をマークする。 このとき、以下の場合はNoとなる。

  • 同じ階が指定されている。
  • 乗った階より降りた階の方が下にある。

次に、下の階から順に、乗り降りした階を対応させていく。 現在の階を Aとし、対応する可能性のある階を Bとすると、 A+1 \leq B \leq 2Nであり、この範囲を全探索すれば良い。

ここで、 A Bを対応させた場合、 C = B - Aとすると、 A \leq X \lt Bにおいて、 X X + Cは制約上対応しなければならない。 つまり、これらが対応できる場合、次に探索するのは B + C階からとなる。 ただし、以下の場合は A Bを対応することはできない。

  •  B + C \gt 2N + 1 Xと対応する階がない)。
  •  Xに降りた階 Yがマークされているが、 Y - X \neq Cである。
  •  X Rがマークされている。
  •  X + C Lや降りた階がマークされている。
  •  X L X + C Rがマークされている(異なる人物の記録は対応できない)。

最後に、ある対応付けが上手くいった場合はYesである。 上手くいかなかった場合は、探索開始が同じであれば結果は同じとなるので、メモしておく。 よって、動的計画法の考え方に帰着された。 計算量は(恐らく) O(n^3)である。

コード

Submission #17181371 - AtCoder Regular Contest 104

感想

場合分けが多いと厳しい。