据说可以每个把每个点的权值看作在这位置上有几个点,但我的想法比较简单粗暴:每向右一步就把减去其右边的点的权值和,加上左边所有点的权值和
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn = 3e5 + 10;
ll a[maxn];
ll n, m, sum, sub, ans, mini;
int main(){
scanf("%lld", &n);
for(int i = 1; i <= n; i++){
ll x, y;
scanf("%lld%lld", &x, &y);
a[x + 100000] = y;
ans += (x + 100000) * y;
sub += y;
}
mini = ans;
for(int i = -1e5 + 1; i <= 1e5; i++){
ans += sum;
ans -= sub;
if(a[i + 100000] > 0){
sum += a[i + 100000];
sub -= a[i + 100000];
}
if(ans < mini) mini = ans;
}
printf("%lld\n", mini);
return 0;
}