直角三角形

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
.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值