G - Tile Distance 3 Editorial
by
cn449
適切に回転・平行移動・裏返しを行うことで、\(0 \leq S_x < K, 0 \leq S_y < K, 0 \leq T_x, 0 \leq T_y\) である場合に帰着できます。 以下この状況であることを仮定します。
整数 \(i, j, k\) を \((T_x + 0.5, T_y + 0.5)\) がタイル \((i, j, k)\) に含まれているようなものとして定めます。
この問題の本質は適切な場合分けを行うことですが、一例として \(i = j = 0\) であるか、\(\max(S_y, K - 3)\) の値、\(\min(k, 2)\) の値、 \(K = 2\) であるか、\(i\) と \(j\) の偶奇、\(i\) と \(j\) の大小関係を用いることによりすべての場合を定数個の簡単な問題に帰着できます。
まず \(i = j = 0\) であるときについて考えます。答えが \(0, 1\) であるかの判定は容易です。そうでないときは、タイル \((1, 0, 0)\) を通ることにより \(2\) 回の移動によりタイル \((i, j, k)\) に到達できます。
以下、\(i \neq 0\) または \(j \neq 0\) であるとします。
\(S_y \leq K - 3\) とすると、答えは \(S_y\) の値によらない(つまり、\(S_y = K - 3\) としてよい)ことが帰納的にわかります。同様に、\(k \geq 2\) のときは答えは \(k\) の値によりません。
さらに、タイル \((i, j, k)\) に辿り着くまでに移動する回数を \(f_0\)、タイル \((i - 1, j - 1, k)\) に辿り着くまでに移動する回数を \(f_1\) とおくと、\(i > 0, j > 0, (i, j) \neq (1,1)\) のとき \(f_0 = f_1 + 2\) であることもわかります。
したがって \(i = 0, j = 0, (i, j) = (1, 1)\) のケースを解決できればよいです。
これらの個別ケースは丁寧に処理することにより一つ一つは非常に簡単な式となりますが、方針によっては \(K = 2\) であるかの場合分けが必要となることもあります。
方針の一例として、上述の \(f_0\) と \(f_1\) の関係式と同様に、タイル \((0, j, k)\) に辿り着くまでに移動する回数を \(g_0\)、タイル \((0, j - 2, k)\) に辿り着くまでに移動する回数を \(g_1\) とおくと、\(j \leq 3\) のとき \(K = 2\) ならば \(g_0 = g_1 + 3\)、\(K \neq 2\) ならば \(g_0 = g_1 + 4\) となることを用いるようなものがあります。また、\(j = 0\) のケースについても同様の関係式が成り立ちます。
以上により、各テストケースにおいて定数回の計算によって答えを得ることができます。
証明において、常に \(x \geq 0\) および \(y \geq 0\) の範囲のみ通るとしてもよいことを用いたり、\(n\) 回以下の移動で到達できるタイルの集合を帰納的に考えたりすることで考えるべきことの複雑さをある程度抑えられるでしょう。
場合分けに自信のない場合は、01BFS などによる愚直解を書き、様々なケースについて自分の解法が正しい出力をしているかチェックすることをお勧めします。
posted:
last update: