题目:
平面上给定N个两两不同的整点,统计以给定的点为顶点,且直角边平行于坐标轴的直角三角形数。
分析:
直接枚举每个点坐标即可。
附上代码:
type
arr=array [1..100002] of longint;
var
x,y,x1,y1,x2,y2,numx,numy:arr;
n:longint;
procedure qsort(l,r:longint; var a:arr);
var
i,j,mid,temp:longint;
begin
if l>=r then
exit;
mid:=a[l+random(r-l+1)];i:=l;j:=r;
repeat
while a[i]<mid do
inc(i);
while a[j]>mid do
dec(j);
if i<=j then
begin
temp:=a[i];a[i]:=a[j];a[j]:=temp;
inc(i);dec(j);
end;
until i>j;
qsort(l,j,a);
qsort(i,r,a);
end;
procedure init;
var
i:longint;
begin
readln(n);
for i:=1 to n do
begin
readln(x[i],y[i]);
x1[i]:=x[i];
y1[i]:=y[i];
end;
end;
procedure main;
var
i,k,k1,temp,l1,r1,t,mid,ans,num1,num2:longint;
begin
ans:=0;qsort(1,n,x);qsort(1,n,y);k:=1;x2[k]:=x[1];
for i:=2 to n do
begin
if x[i]=x[i-1] then
inc(numx[k])
else
begin
inc(k);
x2[k]:=x[i];
end;
end;
k1:=1;
y2[k1]:=y[1];
for i:=2 to n do
begin
if y[i]=y[i-1] then
inc(numy[k1])
else
begin
inc(k1);
y2[k1]:=y[i];
end;
end;
x:=x1;
y:=y1;
for i:=1 to n do
begin
temp:=x[i];t:=y[i];l1:=1;r1:=k;
while l1<=r1 do
begin
mid:=(l1+r1) shr 1;
if x2[mid]=temp then
break;
if x2[mid]>temp then
r1:=mid-1
else
l1:=mid+1;
end;
if x2[mid]=temp then
num1:=numx[mid];
l1:=1;r1:=k1;
while l1<=r1 do
begin
mid:=(l1+r1) shr 1;
if y2[mid]=t then
break;
if y2[mid]>t then
r1:=mid-1
else
l1:=mid+1;
end;
if y2[mid]=t then
num2:=numy[mid];
ans:=ans+num1*num2;
end;
writeln(ans);
end;
begin
init;
main;
end.