直角三角形 (Standard IO)

题意/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.



原文地址:https://www.cnblogs.com/zyx-crying/p/9319619.html