传送门biu~
曼哈顿距离转切比雪夫距离公式:
||x1−x2|+|y1−y2|=max{|(x1+y1)−(x2+y2)|,|(x1−y1)−(x2−y2)|}
|
|
x
1
−
x
2
|
+
|
y
1
−
y
2
|
=
max
{
|
(
x
1
+
y
1
)
−
(
x
2
+
y
2
)
|
,
|
(
x
1
−
y
1
)
−
(
x
2
−
y
2
)
|
}
的逆用。把每个点的坐标(x,y)转化为(x+y,x-y)。那么题目中的切比雪夫距离就转化为了曼哈顿距离。对于新图分别求x,y坐标的中位数即为答案坐标。
如果求出的答案坐标x和y的奇偶性不同,说明这个答案在转化前不是整点,那么在这个点周围四个位置找最小答案即可。
#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n,X[N],Y[N],xx[]={1,-1,0,0},yy[]={0,0,1,-1};
long long sum,ans;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
int x,y;
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);
int ax=X[n+1>>1],ay=Y[n+1>>1];ans=0;
if((ax&1)==(ay&1)){
for(int i=1;i<=n;++i)
ans+=abs(ax-X[i])+abs(ay-Y[i]);
printf("%lld\n",ans>>1);
}
else{
for(int i=0;i<4;++i){
sum=0;
int nx=ax+xx[i];
int ny=ay+yy[i];
for(int i=1;i<=n;++i)
sum+=abs(nx-X[i])+abs(ny-Y[i]);
if(!ans || sum<ans) ans=sum;
}
printf("%lld\n",ans>>1);
}
return 0;
}