ZJU2107最近点对

来源:百度知道 编辑:UC知道 时间:2024/05/23 16:09:30
http://acm.zju.edu.cn/show_problem.php?pid=2107
就是说给你N(n<=100000)个点,要你求出最近的两个点的距离的一半。
要给出详细的思路,最好附上源程序(PASCAL更佳),好的有追加。

最接近的点或者x坐标相邻,或者y坐标相邻,只要排两次序,取相邻两点距离即可得到答案,复杂度为(2nlogn+2n)

var a:array[1..100000] of longint;
b:array[1..100000,1..2] of real;
q,w:real;
i,j,k,l,o,p,n,m:longint;

procedure sortx(l,r:longint);
var i,j,k:longint;
o,p:real;
begin
i:=l;j:=r;o:=b[a[(i+j) div 2],1];p:=b[a[(i+j) div 2],2];
while i<=j do
begin
while (b[a[i],1]<o) or ((b[a[i],1]=o) and (b[a[i],2]<p)) do inc(i);
while (b[a[j],1]>o) or ((b[a[j],1]=o) and (b[a[j],2]>p)) do dec(j);
if i<=j then begin
k:=a[i];a[i]:=a[j];a[j]:=k;
inc(i);dec(j);
end;
end;
if i<r then sortx(i,r);
if l<j then sortx(l,j);
end;

procedure sorty(l,r:longint);
var i,j:longint;
o,p:real;
begin
i:=l;j:=r;o:=b[a[(i+j) div 2],1];p:=b[a[(i+j) div 2],2];
while i<=j do
begin
while (b[a[