直角三角形

来源:互联网 发布:程序员编程用什么软件 编辑:程序博客网 时间:2024/04/30 14:24

Description

  平面上给定N个两两不同的整点,统计以给定的点为顶点,且直角边平行于坐标轴的直角三角形数。

Input

  输入文件right.in第一行为一个整数N。
  以下N行,每行给出一个点的坐标。

Output

  输出文件名为right.out。输出一个整数表示统计结果。

Sample Input

4

0 0

0 1

1 0

1 1

Sample Output

4

Data Constraint

Hint

【数据规模和约定】
  30%的数据满足 N ≤ 100;
  50%的数据满足 N ≤ 1000;
  100%的数据满足0 < N ≤ 100000,所有坐标不超过32位整数范围。

 

分析:我们把每个点都做一次直角顶点,然后求该点在同一行,同一列的点(平行坐标轴)。把这两条直线除自己外的点数想乘加入结果即可。(我一开始爆零了,早了半天原来打错一个字母,下次一定注意)。

 

标程:

type
 arr=array [1..100002] of longint;
var
 x,y,dx,dy,gx,gy,numx,numy:arr;
 n,i,k,k1,s,r,l,t,mid,a,b,ans:longint;
 
procedureqsort(l,r:longint; var a:arr);
var i,j,mid,temp:longint;
begin
if l>=r thenexit;
 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;
 
begin
 readln(n);
for i:=1to n do
begin
  readln(x[i],y[i]);
  dx[i]:=x[i]; dy[i]:=y[i];
end;
 qsort(1,n,x);
 qsort(1,n,y);
 k:=1;
 gx[k]:=x[1];
for i:=2to n do
  begin
   if x[i]=x[i-1] then
    inc(numx[k])
   elsebegin inc(k); gx[k]:=x[i]; end;
  end;
 k1:=1;
 gy[k1]:=y[1];
for i:=2to n do
  begin
   if y[i]=y[i-1] then
    inc(numy[k1])
   elsebegin inc(k1); gy[k1]:=y[i]; end;
  end;
 x:=dx; y:=dy;
for i:=1to n do
begin
  s:=x[i]; t:=y[i];
  l:=1; r:=k;
  while l<=r do
   begin
    mid:=(l+r) shr1;
    if gx[mid]=s then break;
    if gx[mid]>s then r:=mid-1
                 else l:=mid+1;
   end;
  if gx[mid]=s then a:=numx[mid];
  l:=1; r:=k1;
  while l<=r do
   begin
    mid:=(l+r) shr1;
    if gy[mid]=t then break;
    if gy[mid]>t then r:=mid-1
                 else l:=mid+1;
   end;
  if gy[mid]=t then b:=numy[mid];
  ans:=ans+a*b;
end;
writeln(ans);
end.

 

0 0
原创粉丝点击