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: