CF419B的题解
(一)
最简洁易懂的代码。
设点 \(A=(x,y)\),\(B=(xx,yy)\) 则 \(Dis(A,B)=\vert x-xx\vert +\vert y-yy\vert\)。
观察上面这个式子,不太好求,考虑转化为一堆数取最大的形式。
设 \(x1=x+y\),\(y1=x-y\),\(x2=xx+yy\),\(y2=xx-yy\)。
则 \(Dis(A,B)=max(x1-x2,y1-y2)\),自己可以分讨算一下。
那么直接记录 $n $ 个人的位置中最小和最大的 \(x1\),\(y1\)。
(二)
记得开 long long。
AC 代码。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf=1e18;
int x,y,n,m,mnx=inf,mxx=-inf,mxy=-inf,mny=inf,ans=inf,ansid;
signed main(){
scanf("%lld%lld",&x,&y);
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld%lld",&x,&y);
mnx=min(mnx,x+y),mxx=max(mxx,x+y);
mny=min(mny,x-y),mxy=max(mxy,x-y);
}
scanf("%lld",&m);
for(int i=1;i<=m;i++){
scanf("%lld%lld",&x,&y);
int xx=x,yy=y;
x=xx+yy,y=xx-yy;
int s=max(max(abs(x-mnx),abs(x-mxx)),max(abs(y-mny),abs(y-mxy)));
if(s<ans)ans=s,ansid=i;
}
printf("%lld\n%lld\n",ans,ansid);
return 0;
}