传送门biu~
原问题是求一个切比雪夫距离,我们像【bzoj 3210】花神的浇花集会那样把问题转化为曼哈顿距离。
维护x、y的前缀和,很容易就可以求出某个点的答案,时间复杂度
O(nlogn)
O
(
n
log
n
)
。
#include<bits/stdc++.h>
#define N 100050
using namespace std;
int n,X[N],Y[N];
long long ans=1e15,sumX[N],sumY[N];
struct data{int x,y;}a[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
int x,y;
scanf("%d%d",&x,&y);
X[i]=a[i].x=x+y;
Y[i]=a[i].y=x-y;
}
sort(X+1,X+n+1);sort(Y+1,Y+n+1);
for(int i=1;i<=n;++i){
sumX[i]=sumX[i-1]+X[i];
sumY[i]=sumY[i-1]+Y[i];
}
for(int k,i=1;i<=n;++i){
long long now=0;
k=lower_bound(X+1,X+n+1,a[i].x)-X;
now+=1ll*a[i].x*(k-1)-sumX[k-1];
now+=sumX[n]-sumX[k]-1ll*a[i].x*(n-k);
k=lower_bound(Y+1,Y+n+1,a[i].y)-Y;
now+=1ll*a[i].y*(k-1)-sumY[k-1];
now+=sumY[n]-sumY[k]-1ll*a[i].y*(n-k);
ans=min(ans,now);
}
printf("%lld\n",ans>>1);
return 0;
}