BIT
期待値
ABC
F
ABC276 F - Double Chance
https://atcoder.jp/contests/abc276/tasks/abc276_f (opens in a new tab)
水色上位。期待値。
に対して が計算される(つまりカード とカード が取り出される)確率はすべて等しく である。
期待値の線形性から を高速に計算できればよい。
また上式は と考えると、 と変形できるから、 と小さい から順に計算していくことができる。
第 2 項は BIT により計算できる。 に対して、 以下の要素に対してはその個数 × 、 より大きい要素に対しては、もう 1 本 BIT を用意しておきそちらで計算する。詳しくは実装を。
from atcoder.fenwicktree import FenwickTree
MOD = 998244353
n = int(input())
a = list(map(int, input().split()))
max_a = max(a)
# bit0[i] := a[:k]に含まれるiの個数
bit0 = FenwickTree(max_a + 1)
# bit1[i] := a[:k]に含まれるiの個数×i
bit1 = FenwickTree(max_a + 1)
numerator = 0
for k in range(n):
subtotal = 0u
subtotal += bit0.sum(0, a[k] + 1) * a[k]
subtotal += bit1.sum(a[k] + 1, max_a + 1)
denominator_inv = pow((k + 1) * (k + 1), MOD - 2, MOD)
numerator = numerator + subtotal * 2 + a[k]
print(numerator * denominator_inv % MOD)
bit0.add(a[k], 1)
bit1.add(a[k], a[k])