公式

D - Minimize Inversion 解説 by potato167


\(f(P)\) について以下が成り立ちます。

\(L_{P_{i}}\)\(j < i\) かつ、\(P_{j} < P_{i}\) を満たす \(j\) の数とする。 \(R_{P_{j}}\)\(i > j\) かつ、\(P_{j} < P_{i}\) を満たす \(j\) の数とする。 このとき、\(f(P) = \sum_{i = 1}^{N} \min(L_{i}, R_{i})\)

これは、\(A_{i} < A_{j}\) が成り立つか否かには、\(P_{i} < P_{j}\) ならば、\(A_{j}\) の正負のみで決まり、\(P_{i} > P_{j}\) ならば、\(A_{i}\) の正負のみで決まることから示せます。

\(X[i][j]\)\(P_{K} = i\) を満たす全ての \(P\) に対する、\(\min(L_{j}, R_{j})\) の総和とします。

すると、答えは \(\sum X[a][j]\) とあらわせます。

全ての \(X[a][j]\) を求めたいです。

\(a > j\) のとき

\(0\) 以上 \(j\) 未満の任意の整数 \(b\) に対して、以下が成り立ちます。

  • \(L_{j} = b\) かつ \(P_{K} = a\) を満たす順列 \(P\) の場合の数は \(\dfrac{(N - 1)!}{j}\)

よって、\(X[a][j] = \displaystyle\dfrac{(N - 1)!}{j}\sum_{b = 0}^{j - 1}\min(b, j - 1 - b)\) となります。この値は、階乗や逆数を前計算していれば \(O(1)\) で求まります。

\(a = j\) のとき

\(L_{j}, R_{j}\) を固定したとき、\(P\) が何通りあるかは以下の式で表せます。

\[\binom{K - 1}{L}\cdot \binom{N - K}{R}\cdot(j - 1)!\cdot(N - j)!\]

よって、任意の \(L, R\) について、\(\binom{K - 1}{L}\cdot \binom{N - K}{R}\cdot\min(L, R)\) の総和を求めれば良いです。

愚直に計算すると \(O(j)\)\(X[j][j]\) は求められますが、全ての \(j\) に対して \(X[j][j]\) を愚直に求めると TLE してしまいます。よって、全ての \(j\) に対する \(X[j][j]\) を畳み込みを用いて同時に求めます。

\(L< R\) かつ \(L + R + 1 = j\) を満たす整数の \(L, R\) に対する \(\binom{K - 1}{L}\cdot \binom{N - K}{R}\cdot\min(L, R)\) の総和を \(Y_{j}\) とします。

多項式 \(f(x), g(x)\) を以下が成り立つように定義します。

  • \([x^{l}]f(x) = \binom{K - 1}{l}\cdot l\)
  • \([x^{r}]g(x) = \binom{N - K}{r}\)

すると、\(Y_{j}\) に対して以下の式が成り立ちます。

\[Y_{j} = \sum_{L + R = j - 1, L < R}[x^{l}]f(x)\cdot[x^{r}]g(x)\]

\(L < R\) という条件がなければ畳み込みを \(1\) 回すれば任意の \(j\) に対して \(Y_{j}\) が求めれられます。

\(L < R\) という条件があっても、分割統治と畳み込みを用いれば時間計算量 \(O(N\log^{2}(N))\) で求められます。

以上で \(L < R\) の場合の \(X[j][j]\) に対する寄与が求められました。\(L\geq R\) の場合も同様にして求められます。

\(a < j\) のとき

\(a > j\) のときと同様の考えで \(\displaystyle\sum_{k = 1}^{N}X[k][j] = \dfrac{N!}{j}\sum_{b = 0}^{j - 1}\min(b, j - 1 - b)\) が成り立ちます。

また、\(k < j\) を満たす任意の \(X[k][j]\) について値が変わらないことと、\(k > j\) を満たす任意の \(X[k][j]\) について値が変わらないことと、\(X[j][j]\) の値が上で計算できていることから \(X[a][j]\)\(O(1)\) で計算できます。

任意の \(i, j\) に対して \(X[i][j]\) が求められたので、元の問題も適切に差分更新することで答えが求められます。

具体的には、上記の情報をもとに \(\sum X[1][j]\) を求めた後、\(\sum X[a + 1][j] - \sum X[a][j] = X[a + 1][a + 1] - X[a][a] + X[a + 1][a] - X[a][a + 1]\) が成り立つことを用いて、\(a = 2, 3, \dots, N\) の順に \(\sum X[a][j]\) を求めれば良いです。

\(a = j\) のときの \(X[a][j]\) を求める部分がボトルネックとなって、時間計算量は \(O(N\log^{2}{N})\) です。


追記

この問題が \(O(N)\) で解けることがコンテスト中に発覚しました。解法については、i_am_noob さんによる以下の解説を参照してください。

https://atcoder.jp/contests/arc213/editorial/15163

投稿日時:
最終更新: