样例输出了一个奇怪数(
#include <bits/stdc++.h>
using namespace std;
struct point {
long long v;
long long x;
};
bool cmpv (point x, point y) {
return x.v < y.v;
}
point a[50086];
long long ans = 0;
long long sum[50086];
point tmp[50086];
void solve (int l, int r) {
if (l == r) return;
int mid = (l + r) / 2;
solve(l, mid);
solve(mid + 1, r);
for (int i = l; i <= r; i++) sum[i] = sum[i - 1] + a[i].x;
int i = l;
for (int j = mid + 1; j <= r; j++) {
while (a[i].x <= a[j].x)
i++;
i--;
ans += a[j].v * ((i - l + 1) * a[j].x - sum[i] + sum[mid] - sum[i] - (mid - i) * a[j].x);
}
i = l;
int j = mid + 1, tmpp = l;
while (i <= mid && j <= r) {
if (a[i].x > a[j].x) {
tmp[tmpp] = a[j];
tmpp++, j++;
} else {
tmp[tmpp] = a[i];
tmpp++, i++;
}
}
for (int k = i; k <= mid; k++) {
tmp[tmpp] = a[k];
tmpp++;
}
for (int k = j; k <= r; k++) {
tmp[tmpp] = a[k];
tmpp++;
}
for (int k = j + 1; k <= r; k++) tmp[k] = a[k];
for (int k = l; k <= r; k++) a[k] = tmp[k];
return;
}
int main () {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%lld%lld", &a[i].v, &a[i].x);
sort(a + 1, a + n + 1, cmpv);
solve(1, n);
printf("%lld", ans);
return 0;
}