mini notes

競技プログラミングの解法メモを残していきます。

ARC039 C - 幼稚園児高橋君

問題:C - 幼稚園児高橋君

解答:Submission #15266646 - AtCoder Regular Contest 039

解法:例えば辿ったマスを記憶しておき、辿ったマスへ移動した場合はもう一回移動する、のような解法だとO(N2)でTLE。

Dancing Linksという典型的なテクニックがあるらしい。 辿ったマスの上下左右の最近傍マス(次にその方向に移動したときに到達するマス)を覚えておき、移動するごとに最近傍マスを更新してゆくという考え方。

下記ブログを参考にしました。

ferin-tech.hatenablog.com

具体的な手続きは以下の通り。
マス(x, y)に移動した場合 - マス(x, y)の上下左右の各方向で最近傍マスが設定されていないものがあれば、マス(x, y)をその方向の最近傍マスとして設定する。 - 「マス(x, y)の上下左右の各方向の最近傍マス」の最近傍マスに「マス(x, y)の最近傍マス」の情報を反映する。例えば、マス(x, y)の右のマス(x', y')の左の最近傍のマスを、マス(x, y)の左の最近傍マスに更新する。