Description
平面上给定N个两两不同的整点,统计以给定的点为顶点,且直角边平行于坐标轴的直角三角形数。
Input
输入文件right.in第一行为一个整数N。
以下N行,每行给出一个点的坐标。
Output
输出文件名为right.out。输出一个整数表示统计结果。
分析
水题
先把每横线和每纵线上有多少个点都统计出来,然后枚举每一个点(坐标很大要用hash)
把这个点的横坐标的线和纵坐标的线上的点数分别-1后相乘
所有点的结果的和就是ans
const
max2=100500;
q=403219;
var
h,f,g:array[-5*max2..5*max2] of int64;
h1,f1,g1:array[-5*max2..5*max2] of int64;
x,y:array[1..max2] of longint;
max,max1:longint;
i,j,k:longint;
ans:int64;
n:longint;
function hash(x:longint):longint;
var
i,j,k:longint;
begin
i:=x mod q;
while (h[i]<>0) and (h[i]<>x) do
i:=i mod q+1;
hash:=i;
end;
function hash1(x:longint):longint;
var
i,j,k:longint;
begin
i:=x mod q;
while (h1[i]<>0) and (h1[i]<>x) do
i:=i mod q+1;
hash1:=i;
end;
begin
readln(n);
max:=0;
for i:=1 to n do
begin
readln(x[i],y[i]);
j:=hash(y[i]);
if h[j]<>y[i]
then
begin
max:=max+1;
f[j]:=max;
h[j]:=y[i];
g[f[j]]:=g[f[j]]+1;
end
else
g[f[j]]:=g[f[j]]+1;
j:=hash1(x[i]);
if h1[j]<>x[i]
then
begin
max1:=max1+1;
f1[j]:=max1;
h1[j]:=x[i];
g1[f1[j]]:=g1[f1[j]]+1;
end
else
g1[f1[j]]:=g1[f1[j]]+1;
end;
ans:=0;
for i:=1 to n do
begin
ans:=ans+(g[f[hash(y[i])]]-1)*(g1[f1[hash1(x[i])]]-1);
end;
write(ans);
end.