您的位置:首页 > 其它

直角三角形 (Standard IO)

2016-08-11 21:17 309 查看
题意/Description:

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

读入/Input:

   
   输入文件right.in第一行为一个整数N。

  以下N行,每行给出一个点的坐标。

输出/Output:

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

题解/solution:

 
     枚举直角顶点(x,y),设横坐标为x的点有a个,纵坐标为y的点有b个。那么对答案的贡献为(a-1) * (b-1)。a和b可以事先全部统计出来,最后累加统计。

代码/Code:

const
maxn=137127;
var
n,ans:longint;
a,b,x,y,xnum,dx,ynum,dy:array [0..maxn] of longint;
function hashx(o:longint):longint;
var
i:longint;
begin
i:=o mod maxn;
while (x[i]<>0) and (x[i]<>o) do
i:=i mod maxn+1;
exit(i);
end;

function hashy(o:longint):longint;
var
i:longint;
begin
i:=o mod maxn;
while (y[i]<>0) and (y[i]<>o) do
i:=i mod maxn+1;
exit(i);
end;

procedure init;
var
i,o,p,numx,numy:longint;
begin
readln(n);
numx:=0; numy:=0;
for i:=1 to n do
begin
readln(a[i],b[i]);
o:=hashx(b[i]);
if x[o]<>b[i] then
begin
inc(numx);
xnum[o]:=numx;
inc(dx[xnum[o]]);
x[o]:=b[i];
end else inc(dx[xnum[o]]);
p:=hashy(a[i]);
if y[p]<>a[i] then
begin
inc(numy);
ynum[p]:=numy;
inc(dy[ynum[p]]);
y[p]:=a[i];
end else inc(dy[ynum[p]]);
end;
ans:=0;
end;

procedure main;
var
i:longint;
begin
for i:=1 to n do
ans:=(dx[xnum[hashx(b[i])]]-1)*(dy[ynum[hashy(a[i])]]-1)+ans;
write(ans);
end;

begin
init;
main;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息