4 6 -4 -1 -1 -2 2 -4 0 2 0 3 5 -2 6 0 0 2 0 -5 -2 2 -2 -1 2 4 0 5 -5 1 -1 3 3 1 3 -1 1 -1 10 -1 -1 -3 2 -4 4 5 2 5 -4 3 -1 4 3 -1 -2 3 4 -2 2
26 20 20 56HintIn the first case, the meeting point is (-1,-2); the second is (0,0), the third is (3,1) and the last is (-2,2)
思路:x,y到某点的曼哈顿距离可以分开算,因此,分开枚举以某点为中心的值球最小就好了。
预处理,kx[x]以某点 x为中心的所有x距离和,ky[]同理。kx[i]=kx[i-1]+(i-n+i)*(f[i].x-f[i-1].x);
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; const int mm=2e5+9; class node { public: __int64 x,y; int id; } f[mm]; bool cmpx(node a,node b) { return a.x<b.x; } bool cmpy(node a,node b) { return a.y<b.y; } __int64 kx[mm],ky[mm]; __int64 sum; __int64 aabs(__int64 x) { if(x<0)return -x; return x; } int main() { int cas;__int64 n; while(~scanf("%d",&cas)) { while(cas--) { scanf("%I64d",&n); for(int i=0; i<n; ++i) scanf("%I64d%I64d",&f[i].x,&f[i].y); sort(f,f+n,cmpx); kx[0]=0; for(int i=0; i<n; ++i) { kx[0]+=aabs(f[i].x-f[0].x); f[i].id=i; } for(__int64 i=1; i<n; ++i) kx[i]=kx[i-1]+(i-n+i)*(f[i].x-f[i-1].x); //for(int i=0;i<n;++i) //cout<<" "<<kx[i]<<" ";puts(""); sort(f,f+n,cmpy); ky[0]=0; for(int i=0;i<n;++i) ky[0]+=aabs(f[i].y-f[0].y); for(__int64 i=1;i<n;++i) ky[i]=ky[i-1]+(i+i-n)*(f[i].y-f[i-1].y); //for(int i=0;i<n ;++i) //cout<<" "<<ky[i]<<" ";puts(""); sum=6e18; for(int i=0;i<n;++i) { //cout<<f[i].id<<" "<<i<<" "<<kx[f[i].id]<<" "<<ky[i]<<" "<<ky[i]+kx[f[i].id]<<endl; if(sum>ky[i]+kx[f[i].id])sum=ky[i]+kx[f[i].id]; } printf("%I64d\n",sum); } } return 0; }