Official

E - Shuffle Window Editorial by yosupo


問題を言い換えます。最終的な数列は以下のような手続きにより生成された数列 \(B\) であると考えることが出来ます。

  • \(K\) 要素の(多重)集合 \([a_1, a_2, \dots, a_K]\) 、空の配列 \(B\) を考える。以下の操作を \(i = 1, 2, \dots, N - K\) について行う

    • 集合からランダムに要素を一つ取り出し、\(B\) の末尾に追加する。
    • 集合に \(a_{i + K}\) を追加する。
  • そして最後に、集合に残った \(K\) 要素をランダムに並び替え、\(B\)の末尾に追加する。

ここで、\(f(i) = \max(i - K, 0)\) と置きます。 これは、\(a_i\)\(f(i)\) 回目の操作で集合に追加されるという意味です。

あるペア \(i, j(i < j)\) について、最終的な数列で \(a_i, a_j\) が入れ替わっている確率に注目します。

もし \(2\) つの要素が同時に集合に入ったタイミングがあったならば、操作の性質上 \(a_i, a_j\) のどちらが最終的な数列で先になるかは等確率です。 また、同時に集合に入るタイミングの存在する確率は、\(p = (K - 1) / K\) として、\(p^{f(j) - f(i)}\) です。よって、\(a_i, a_j\) が入れ替わる確率は \(\frac{p^{f(j) - f(i)}}{2}\) です。

以上をまとめ、更に式を整理すると、この問題の本質は、

  • \(a_i > a_j\) を満たすペア \((i, j)\) についての、\(p^{f(j) - f(i)} = \frac{p^{f(j)}}{p^{f(i)}}\) の総和を求める

ということになります。これは \(j\) を固定すると、\(i < j, a_i > a_j\) を満たす全ての \(i\) について \(\frac{1}{p^{f(i)}}\) の総和を求めよ、となります。よってFenwick Treeにより(転倒数を数えるのと同様のアルゴリズムで)計算可能です。

posted:
last update: