Peking University Online Judge 1990 MooFest
こちらはBinary Indexed Treeで。参照渡しが使えるとお利口さんに見えると思います。
類題:https://beta.atcoder.jp/contests/abc038/tasks/abc038_d
#include<cstdio> #include<algorithm> using namespace std; typedef long long int ll; typedef pair<int, int> P; static const int MAX_N = 20000; static const int MAX_X = 20000; int N; P p[MAX_N]; int bit1[MAX_X + 1], bit2[MAX_X + 1]; ll sum(int i, int *arr){ ll res = 0; while(i > 0){ res += arr[i]; i -= i & -i; } return res; } void add(int i, int x, int *arr){ while(i <= MAX_X){ arr[i] += x; i += i & -i; } return ; } int main(){ scanf("%d", &N); for(int i = 0; i < N; i++) scanf("%d %d", &p[i].first, &p[i].second); sort(p, p + N); ll res = 0LL; for(int i = 0; i < N; i++){ ll sum_d = sum(MAX_X, bit1) - 2 * sum(p[i].second, bit1); sum_d += -(sum(MAX_X, bit2) - 2 * sum(p[i].second, bit2)) * p[i].second; res += p[i].first * sum_d; add(p[i].second, p[i].second, bit1); add(p[i].second, 1, bit2); } printf("%lld\n", res); return 0; }