求的是曼哈顿距离。可以把X,Y的距离分开来求。其中,求X、Y的距离可以通过排序后递推的方式求出值的。
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #define LL __int64 using namespace std; struct point{ int x,y; int num; }acm[100005]; int n; bool cmpx(point a, point b){ if(a.x<b.x) return true; return false; } bool cmpy(point a,point b){ if(a.y<b.y) return true; return false; } LL distx[100005],disty[100005]; LL mint(LL a,LL b){ if(a<b) return a; return b; } void init(){ for(int i=0;i<n;i++) distx[i]=disty[i]=0; } int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d",&n); init(); for(int i=0;i<n;i++){ scanf("%d%d",&acm[i].x,&acm[i].y); acm[i].num=i; } LL tmp; sort(acm,acm+n,cmpx); tmp=0; for(int i=0;i<n;i++){ if(!i) tmp=distx[acm[i].num]=0; else{ distx[acm[i].num]=tmp=tmp+(LL)i*((LL)acm[i].x-(LL)acm[i-1].x); } } tmp=0; for(int i=n-1;i>=0;i--){ if(i==n-1){ tmp=0; distx[acm[i].num]+=tmp; } else { tmp=tmp+(LL)(n-1-i)*((LL)acm[i+1].x-(LL)acm[i].x); distx[acm[i].num]+=tmp; } } sort(acm,acm+n,cmpy); for(int i=0;i<n;i++){ if(!i) disty[acm[i].num]=tmp=0; else{ disty[acm[i].num]=tmp=tmp+(LL)i*((LL)acm[i].y-(LL)acm[i-1].y); } } for(int i=n-1;i>=0;i--){ if(i==n-1){ tmp=0; disty[acm[i].num]+=tmp; } else { tmp=tmp+(LL)(n-1-i)*((LL)acm[i+1].y-(LL)acm[i].y); disty[acm[i].num]+=tmp; } } LL ans=distx[0]+disty[0]; for(int i=1;i<n;i++) ans=mint(ans,distx[i]+disty[i]); printf("%I64d ",ans); } return 0; }