G - ノイハの塔 Editorial by Mitsubachi


最後に杭 $1$ に揃えるとして、 $f_i \left( x \right)$ を杭 $i$ に大きさ $1$ から $x$ までの $x$ 個の円盤がある状態から杭 $1$ に全て順番通りに重ねるのに十分な回数とします。 $f_1 \left( N \right) \leq 225000$ となる戦略を考えます。
初めに、全ての円盤が杭 $2$ にあっても杭 $3$ にあっても対称性があるので $f_2 \left( x \right) = f_3 \left( x \right)$ です。 $x=1$ のとき、明らかに $f_1 \left( x \right) = 0 ,f_2 \left( x \right) = 1$ です。 $x \geq 2$ を考えます。

$f_1 \left( x \right)$ を考えます。 $x = l+r$ となる正整数 $l,r$ を定めます。 $x$ 回の操作により大きさ $1$ 以上 $l$ までの $l$ 枚を杭 $2$ へ、 $l+1$ から $x$ までの $r$ 枚を杭 $3$ へ移動できます。
この後は杭 $3$ にある円盤 $r$ 枚を杭 $1$ に順番通りに並べた後、杭 $2$ についても同様にすればよいです。よって $f_1 \left( x \right) \leq x + f_2 \left( l \right) + f_3 \left( r \right) = x + f_2 \left( l \right) + f_2 \left( r \right)$ です。

$f_2 \left( x \right)$ を考えます。 $x = l+r$ となる正整数 $l,r$ を定めます。 $x$ 回の操作により大きさ $1$ 以上 $l$ までの $l$ 枚を杭 $3$ へ、 $l+1$ から $x$ までの $r$ 枚を杭 $1$ へ移動できます。
この後は杭 $1$ にある円盤 $r$ 枚を杭 $1$ に順番通りに並べた後、杭 $3$ についても同様にすればよいです。よって $f_2 \left( x \right) \leq x + f_3 \left( l \right) + f_1 \left( r \right) = x + f_2 \left( l \right) + f_1 \left( r \right)$ です。

ここで、 $l = \lfloor \frac{x}{2} \rfloor , r = \lceil \frac{x}{2} \rceil$ として計算すると $f_1 \left( N \right)$ は $1 \leq N \leq 10000$ において $f_1 \left( N \right) \leq 140442$ が成立します。
よって、この問題を解くことができました。実装の際は、今見ている円盤がある柱の番号と円盤の大きさの最小値と最大値、円盤の順番を持たせた再帰関数で処理すると楽です。
見る円盤の枚数が半分になっていくので $1$ 枚の柱につき $O \left( \log N \right)$ 回の再帰関数で登場します。これより計算量は $O \left( N \log N \right)$ となります。
( やっていることとしては分割統治の感覚に近いです )

実装例(C++)

posted:
last update: