题解 P1158 【导弹拦截】
下面的dalao讲的够清楚了,不过我预处理出了每个节点的【d1】(与1号系统的距离)和【d2】(与2号系统的距离)
#include<bits/stdc++.h>//懒人专用头文件
#define rpt(n) for(register int ttxyc=0;ttxyc<n;++ttxyc)//宏
using namespace std;
inline int read()//快读
{
register int X=0,w=0;register char c=getchar();
for(;c<'0'||c>'9';w|=c=='-',c=getchar());
for(;c>='0'&&c<='9';X=(X<<3)+(X<<1)+(c^48),c=getchar());
return w?-X:X;
}
struct xy
{
int x,y,d1,d2;
}zzz[100000];
int a,b,c,d,n,ans=1<<30,kkk[100001];
inline bool cmp(xy p,xy q)
{
return p.d1<q.d1;
}
main()
{
a=read();b=read();c=read();d=read();n=read();//压行好玩
rpt(n)
{
zzz[ttxyc].x=read();zzz[ttxyc].y=read();
zzz[ttxyc].d1=(a-zzz[ttxyc].x)*(a-zzz[ttxyc].x)+//【d1】
(b-zzz[ttxyc].y)*(b-zzz[ttxyc].y);
zzz[ttxyc].d2=(c-zzz[ttxyc].x)*(c-zzz[ttxyc].x)+//【d2】
(d-zzz[ttxyc].y)*(d-zzz[ttxyc].y);
}
sort(zzz,zzz+n,cmp);
kkk[n-1]=zzz[n-1].d2;
for(register int i=n-2;i>=0;--i)kkk[i]=max(kkk[i+1],zzz[i].d2);//这个数组是写从i开始往后找,离2号系统最远的距离
ans=kkk[0];
rpt(n)ans=min(ans,zzz[ttxyc].d1+kkk[ttxyc+1]);
// 1号系统的代价 2号系统的代价
printf("%d",ans);//输出
}/**/