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
.