Official

B - Chmax Editorial by Nyaan


\(P\)\(F(P)\) の関係性を考えてみましょう。
\(P\) をサイクル分解と呼ばれる形で表現してみます。つまり、

  • \(N\) 個の頂点 \(1, 2, \dots, N\) と、
  • \(N\) 本の有向辺 ( \(i\) 本目は頂点 \(i\) から頂点 \(P_i\) へ向かう辺)

からなる \(N\) 頂点 \(N\) 辺の有向グラフを考えます。
このようなグラフは必ずいくつかのサイクルから構成された形をしています。例えば \(P = (3, 1, 5, 6, 2, 4)\) のとき、\(P\) から生成されるグラフは \(1 \to 3 \to 5 \to 2 \to 1\) というサイクルと \(4 \to 6 \to 4\) というサイクルからなります。

\(P\) をこのような表現に置き換えた上で \(F(P)\) がどのようになるかを考えてみます。
例えば \(P = (3, 1, 5, 6, 2, 4)\) のとき、\(F(P)\)\(1\) 番目・ \(3\) 番目・ \(5\) 番目の要素は全て \(5\) になりますが、これはサイクル上において \(1 \to 3 \to 5\) とつながっていて、かつ \(5\) から伸びる辺が \(2\) \((\lt 5)\) へつながっているからです。
これを一般化します。サイクル分解で登場するグラフを用いると \(F(P)\) は次のように表現することが出来ます。

  • グラフから (始点の番号) \(\geq\) (終点の番号) であるような辺を取り除く。グラフはいくつかのパスに分解される。
    パスを \(1\) つ取って \(v_1 \to v_2 \to \dots \to v_k\) とすると、\(F(P)\)\(v_i\) 番目の要素は全て \(v_k\) になる。

この性質を利用することでこの問題を解くことが出来ます。

入力で与えられる \(A\) について、\(A_{x_1}, A_{x_2}, \dots, A_{x_k}\)\(n\) が書かれているとします。(\(x_1 \lt x_2 \lt \dots \lt x_k\))
このとき、上述の性質を用いると、\(P\) から生成されるグラフにおいて次の事実が成り立ちます。

  • \(x_1 \to x_2 \to \dots \to x_k\) というパスが存在する。
  • 頂点 \(x_1\) へ向かう辺の始点の番号は \(x_1\) 以上である。
  • 頂点 \(x_k\) から出る辺の終点の番号は \(x_k\) 以下である。

また、このとき \(x_k = n\) が必要になることもわかります。\(x_k \neq n\) である場合は条件を満たす \(P\) は存在せず、答えは \(0\) です。

\(A\) に含まれる全ての \(n\) において \(x_k = n\) という条件が成り立っているとします。このとき、\(P\) から生成されるグラフで表現すると何本かのパスが確定している状態です。今、\(m\) 本のパスが確定していて、\(i\) 本目のパスの始点を \(s_i\) 、終点を \(t_i\) とします。
1 つのサイクル分解の形をしたグラフに 1 つの \(P\) が対応していることから、パス同士をうまく辺で結んでサイクルを作る方法の通り数を数えればそれが答えになります。つまり、

  • 頂点 \(t_i\) から出る辺の終点の番号は \(t_i\) 以下である。
  • 頂点 \(s_i\) へ向かう辺の始点の番号は \(s_i\) 以上である。

という制約を満たすように \((t_1, t_2, \dots, t_m)\)\((s_1, s_2, \dots, s_m)\) をマッチングさせる方法を数える問題に言い換えられて、これは頂点番号を昇順に見ていくことで数えることが出来ます。

以上よりこの問題を解くことが出来ました。計算量は \(\mathrm{O}(N)\) で十分高速です。

posted:
last update: