C - ±1 Operation 1 Editorial by AngrySadEight

全探索を用いた解法

全探索の処理を用いる解法を紹介します.

\(D=0\) であるときは明らかに答えは \(|X - A|\) です.\(D<0\) であるときは公式解説と同様に,\(D>0\) となるように正規化を行うことで,\(D>0\) の場合に帰着できます.以下では \(D>0\) の場合のみを考えます.

数列 \(S\) の初項は \(A\),末項は \(A+D(N-1)\) です.\(X\) が初項以下であるときは,初項に合わせるのが最適です.また,\(X\) が末項以上であるときは,末項に合わせるのが最適です.このことを考えると,\(X \leq A\) のときは答えは \(A-X\)\(X \geq A+D(N-1)\) のときは答えは \(X-A-D(N-1)\) となります.

\(A < X < A+D(N-1)\) のときの答えを求めることを考えましょう.数列 \(S\) は等差数列であるので,その値は \(D\) 個おきに現れることがわかります.したがって,「 \(1\) を加算する」もしくは「 \(1\) を減算する」のどちらかを高々 \(D-1\) 回行うことで,必ず \(X\) を数列 \(S\) に含まれる要素にすることができます.

操作後の \(X\) が数列 \(S\) に含まれるかどうかの判定は,数列 \(S\) が等差数列であることを利用し, \(X\) と数列 \(S\) の初項 \(A\) との差が \(D\) の倍数であるかを判定すればできます.

本問では \(D \leq 10^6\) であるため,この方法で十分高速に答えを求めることができます.

実装例(Python)

posted:
last update: