簡単のため、0-indexedで考えます。
まず、目的の式を
0≤i<j<N∑max(Aj−Ai,0)=0≤i<j<N∑{max(Aj,Ai)−Ai}=0≤i<j<N∑max(Aj,Ai)−0≤i<j<N∑Ai
と式変形します。
ここで、一項目(maxの方)は全ての大きさ 2 のインデックスの集合 {i,j} に対する max(Ai,Aj) の総和と捉えられるので、この総和は A の順番によらないことがわかります。これにより、 A を昇順にソートしたものを B とおくと、
=0≤i<j<N∑max(Aj,Ai)=0≤i<j<N∑max(Bj,Bi)=0≤i<j<N∑Bj=j=0∑N−1jBj
として求めることができます。
一方、二項目(Ai の方)も同様に式変形をすると、
0≤i<j<N∑Ai=i=0∑N−1(N−1−i)Ai
となるので、最終的に求める値は
i=0∑N−1iBi−i=0∑N−1(N−1−i)Ai
と表すことができます。この値は配列のソートを用いることで簡単に求めることができます。
以上でこの問題が解けました。計算量はソートがボトルネックとなり O(NlogN) となります。
実装例(Python3)
Copy
N = int(input())
A = list(map(int, input().split()))
B = sorted(A)
ans = 0
for i in range(N):
ans += i * B[i]
ans -= (N - 1 - i) * A[i]
print(ans)
N = int(input())
A = list(map(int, input().split()))
B = sorted(A)
ans = 0
for i in range(N):
ans += i * B[i]
ans -= (N - 1 - i) * A[i]
print(ans)