模拟一下样例,发现是切比雪夫距离。
根据神奇的公式,把切比雪夫距离点阵中的(x,y)转为(x+y,x-y),即是曼哈顿距离点阵了。
转为曼哈顿距离后,可以通过前后缀预处理的方案实现O(n)取min。
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n;
double a,b,ans=1e30;
double x[N],y[N],sum1[N],sum2[N];
struct number{double x,y;}num[N];
int main(){
scanf("%d",&n);
for (register int i=1; i<=n; ++i)
{
scanf("%lf%lf",&a,&b);
num[i].x=a+b; num[i].y=a-b;
x[i]=num[i].x; y[i]=num[i].y;
}
sort(x+1,x+n+1); sort(y+1,y+n+1);
for (register int i=1; i<=n; ++i) sum1[i]=sum1[i-1]+x[i],sum2[i]=sum2[i-1]+y[i];
for (register int i=1; i<=n; ++i)
{
double now=0;
int pos;
pos=lower_bound(x+1,x+n+1,num[i].x)-x;
now+=(pos*num[i].x-sum1[pos])+(sum1[n]-sum1[pos]-(n-pos)*num[i].x);
pos=lower_bound(y+1,y+n+1,num[i].y)-y;
now+=(pos*num[i].y-sum2[pos])+(sum2[n]-sum2[pos]-(n-pos)*num[i].y);
ans=min(ans,now);
}
ans/=2;
printf("%.0f\n",ans);
return 0;
}