F - Double Sum Editorial by evima
ちょっとした別解公式解説は数列を右から左に走査していますが、小さい値から順に処理すると座標圧縮が不要になります。やはり二つの Fenwick Tree を用いますが、こちらでは単に \(A\) に対応させ、\([0, 0, 0, \dots, 0, 0]\)(\(0\) が \(N\) 個)から始めて処理済みの値を追加していきます。
実装例(Python)
from atcoder.fenwicktree import FenwickTree
N = int(input())
A = list(map(int, input().split()))
t0 = FenwickTree(N)
t1 = FenwickTree(N)
ans = 0
for i, a in sorted(enumerate(A), key=lambda x: x[1]):
cnt = t0.sum(0, i)
tot = t1.sum(0, i)
ans += cnt * a - tot
t0.add(i, 1)
t1.add(i, a)
print(ans)
posted:
last update: