【bzoj3210】花神的浇花集会
将(x,y)转化成(x+y,x-y)可以将切比雪夫距离转化成曼哈顿距离(自己推一推)
A、B的切比雪夫距离就是A‘、B‘曼哈顿距离的一半。
那么可以将x、y分离处理,排序中位数即可。
注意如果最后选的最优的X、Y代回去不是整数,要在其上下左右中选个最优方案。
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> using namespace std; typedef long long LL; #define N 100010 int n; int x,y; int X[N],Y[N]; LL check(int x,int y) { LL res(0); for (int i=1;i<=n;i++) res+=abs(x-X[i])+abs(y-Y[i]); return res; } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d%d",&x,&y); X[i]=x+y; Y[i]=x-y; } sort(X+1,X+n+1); sort(Y+1,Y+n+1); x=X[n+1>>1]; y=Y[n+1>>1]; if (~(x ^ y) & 1) printf("%lld\n",check(x,y)>>1); else printf("%lld\n",min(min(check(x+1,y),check(x-1,y)),min(check(x,y+1),check(x,y-1)))>>1); return 0; }