直接坐标转化之后,前缀和过掉
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
struct node{
long long a,b;
int id;
}p[500003];
int n,i,x,y;
long long ans,lx[500003],ly[500003],rx[500003],ry[500003];
bool cmpx(const node& x,const node& y){
return x.a<y.a;
}
bool cmpy(const node& x,const node & y){
return x.b<y.b;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x>>y;
p[i].a=x-y;
p[i].b=x+y;
p[i].id=i;
}
sort(p+1,p+n+1,cmpx);
for(int i=1;i<=n;i++){
lx[p[i].id]=lx[p[i-1].id]+(p[i].a-p[i-1].a)*(i-1);
}
for(int i=n;i>=1;i--){
ly[p[i].id]=ly[p[i+1].id]+(p[i+1].a-p[i].a)*(n-i);
}
sort(p+1,p+n+1,cmpy);
for(int i=1;i<=n;i++){
rx[p[i].id]=rx[p[i-1].id]+(p[i].b-p[i-1].b)*(i-1);
}
for(int i=n;i>=1;i--){
ry[p[i].id]=ry[p[i+1].id]+(p[i+1].b-p[i].b)*(n-i);
}
ans=1e16;
for(int i=1;i<=n;i++){
ans=min(ans,lx[i]+ly[i]+rx[i]+ry[i]);
}
cout<<ans/2;
return 0;
}
/*
in:
6
-4 -1
-1 -2
2 -4
0 2
0 3
5 -2
out:
20
*/