【NOIP2011模拟9.1】直角三角形 (Standard IO)

来源:互联网 发布:apm地面站软件 安卓 编辑:程序博客网 时间:2024/05/21 15:51

Description

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


题解

      我们发现是找两条线段的交点,分别储存横纵坐标,数据大用HASH

代码:

var  x,y,x1,y1,h,hh:array[-1500000..1500000] of longint;  a:array[1..100000,1..2] of longint;  i,j,n,s,m,m1,ans:longint;function h0(a:longint):longint;var  b:longint;begin  b:=a mod 403219;  while (h[b]<>0)and(h[b]<>a) do    b:=b mod 403219+1;  h0:=b;end;function h1(a:longint):longint;var  b:longint;begin  b:=a mod 403219;  while (hh[b]<>0)and(hh[b]<>a) do     b:=b mod 403219+1;  h1:=b;end;begin  readln(n);  for i:=1 to n do    begin      readln(a[i,1],a[i,2]);      j:=h0(a[i,2]);      if h[j]<>a[i,2] then        begin          m:=m+1;          x[j]:=m;          h[j]:=a[i,2];          y[x[j]]:=y[x[j]]+1;        end      else        y[x[j]]:=y[x[j]]+1;      j:=h1(a[i,1]);      if hh[j]<>a[i,1] then        begin          m1:=m1+1;          x1[j]:=m1;          hh[j]:=a[i,1];          y1[x1[j]]:=y1[x1[j]]+1;        end      else        y1[x1[j]]:=y1[x1[j]]+1;    end;  for i:=1 to n do    ans:=ans+(y[x[h0(a[i,2])]]-1)*(y1[x1[h1(a[i,1])]]-1);  writeln(ans);end.



1 0