I - Hop Sugoroku 解説 by Kiri8128


考え方

公式解説 の最初の擬似コードの部分までの考え方は同じです。

\(A_i\) が同じところをなるべくまとめて更新することを考えましょう。具体的には\(i\) からの遷移中に \(A_i=A_j\) となる \(j\) が存在すれば、それ以降は \(j\) のループのときにまとめて合計すれば良いです。

計算量について

計算量は \(O(N\sqrt N)\) です。

計算量の直感的な説明は、「まとめて」更新されるのがなく、かつなるべく \(A_i\) たちが小さいときが最悪ケースになりますが、そのとき\(A\)\(1,\ 2,\ 2,\ 3,\ 3,\ 3,\ 4,\ \cdots\) のようになり、このとき \(j\) 側として呼ばれる回数はそれぞれ \(O(\sqrt N)\) であることから分かります。

より厳密には、 \(G_{k,l} = \{\ i \ |\ 0\le i \lt N,\ A_i=k,\ i \bmod k = l \}\)\(f(G_{k,l})=\displaystyle\frac{N}{k}\) とするとループ数は \(\displaystyle\sum_{G_{k,l}\neq \phi}f(G_{k,l})\) で抑えられますが、 \(f\) が大きい方から \(N\) 個を取ることを考えると上と同じ結論が得られます。

コード例

AC コード (Python)

コードでは、まとめて後で計算する分を配列 Y に格納しています。

投稿日時:
最終更新: