hdu4312 n个平面点选取一个使距离该点切比雪夫距离最小 枚举/快速计算曼哈顿距离
切比雪夫距离和曼哈顿距离就是变成了八个方向只用一步
首先八个方向距离就变成了max(|x1-x2|,|y1-y2|)这样的一个最值式,似乎并没有什么卵用
学到了一个非常机智的转化: max(|x1-x2|,|y1-y2|)=(|x1-x2+y1-y2|+|x1-x2-y1+y2|)/2 。
这个公式需要从两条45°对角线仔细考虑
然后就和4312几乎一样了==
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 struct dian{ 6 long long x,y,id; 7 }a[100005],f[100005]; 8 int cmp1(dian n1,dian n2) 9 { 10 return n1.y<n2.y; 11 } 12 int cmp2(dian n1,dian n2) 13 { 14 return n1.x<n2.x; 15 } 16 int main() 17 { 18 int T; 19 long long n,i,tmp,minx; 20 scanf("%d",&T); 21 while (T--) 22 { 23 scanf("%lld",&n); 24 for (i=1;i<=n;i++) 25 { 26 scanf("%lld%lld",&a[i].x,&a[i].y); 27 tmp=a[i].x; 28 a[i].x=a[i].x+a[i].y; a[i].y=tmp-a[i].y; 29 a[i].id=i; 30 } 31 sort(a+1,a+n+1,cmp1); 32 tmp=0; 33 for (i=2;i<=n;i++) tmp+=a[i].y-a[1].y; 34 f[a[1].id].x=tmp; 35 for (i=2;i<=n;i++) 36 { 37 tmp+=(i-1)*(a[i].y-a[i-1].y); 38 if (i!=n) tmp-=(n-i+1)*(a[i].y-a[i-1].y); 39 f[a[i].id].x=tmp; 40 } 41 sort(a+1,a+n+1,cmp2); 42 tmp=0; 43 for (i=2;i<=n;i++) tmp+=a[i].x-a[1].x; 44 f[a[1].id].y=tmp; 45 for (i=2;i<=n;i++) 46 { 47 tmp+=(i-1)*(a[i].x-a[i-1].x); 48 if (i!=n) tmp-=(n-i+1)*(a[i].x-a[i-1].x); 49 f[a[i].id].y=tmp; 50 } 51 minx=f[1].x+f[1].y; 52 for (i=2;i<=n;i++) 53 minx=min(minx,f[i].x+f[i].y); 54 printf("%lld\n",minx/2); 55 } 56 }