F - A Certain Game Editorial by Tomii9273

マージテク2回とimos法を使う解法

以降では、「人数の多いチームの末尾に人数の少ないチームのプレイヤーを (順序を維持したまま) 全員追加し、人数の少ないチームを削除する」という操作を各対戦について順番に行うことを、マージテク操作と呼びます。

  1. まず、マージテク操作を行い、最終的にできた \(1\) チームを表す数列を \(A\) とします。
  2. \(i = 0, 1, ..., n-1\) について、プレイヤー \(A_i\) の番号を \(i\) に変更します。
  3. もう一度 (振り直した番号のもと) 同様のマージテク操作を行うことを考えます。
    このとき、途中登場するすべてのチームは連続な整数の列で表すことができます。
    そのため、マージテク操作を行いながら imos 法で勝率を区間加算することで、最終的に期待値の数列を構築できます。
  4. 累積和をとり、振り直す前の番号を考慮した解答を作成します。

時間計算量は \(O(N \log N)\) です。
実装例 (Python)

posted:
last update: