这题做了好久都没AC,后来网上一搜才发现是NOIP2010年真题
感谢BJM找了PASCAL代码放到BooleOJ上,还带注解的
var
i,n,j,x,y,x1,x2,y1,y2,r2,ans:longint;
a:array[1..100000,1..2]of longint;
procedure kp(l,r:longint);//快排。
var
i,mid,j,t:longint;
begin
i:=l;j:=r;
mid:=a[(i+j)div 2,1];//取中间值。
repeat
while a[i,1]<mid do inc(i);
while a[j,1]>mid do dec(j);
if i<=j then
begin
t:=a[i,1];a[i,1]:=a[j,1];a[j,1]:=t;
t:=a[i,2];a[i,2]:=a[j,2];a[j,2]:=t;
//第二个系统的半径也要随着交换。
inc(i);dec(j);
end;
until i>j;
if i<r then kp(i,r);//递归自己。
if j>l then kp(l,j);
end;
begin
read(x1,x2,y1,y2,n);
for i:=1 to n do
begin
read(x,y);
a[i,1]:=sqr(x1-x)+sqr(x2-y);
//第一个系统的半径(Sqr是平方的意思)。
a[i,2]:=sqr(y1-x)+sqr(y2-y);
//第二个系统的半径。
end;
kp(1,n);
ans:=a[n,1];//取第一个系统的半径的最大值。
for i:=n downto 1 do//从后面开始枚举。
begin
if a[i,1]+r2<ans then ans:=a[i,1]+r2;
//ans存最小值,也就是答案。
if a[i,2]>r2 then r2:=a[i,2];
//因为第一个系统拦截不到的导弹要第二个系统拦截,
//如果a[i,2]<r2还交换,那肯定就不能拦截所有导弹
//a[i,2]>r2时,第二个系统无法拦截这个大于r2的导弹
//所以要a[i,2]>r2时才交换。
end;
writeln(ans);
end.