直角三角形 纪中2543 枚举+hash

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值