当前位置: 代码迷 >> 综合 >> 【NOIP2011模拟9.1】直角三角形 (Standard IO)
  详细解决方案

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

热度:38   发布时间:2023-10-09 12:21:36.0

Description

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


题解

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

代码:

varx,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;
varb:longint;
beginb:=a mod 403219;while (h[b]<>0)and(h[b]<>a) dob:=b mod 403219+1;h0:=b;
end;
function h1(a:longint):longint;
varb:longint;
beginb:=a mod 403219;while (hh[b]<>0)and(hh[b]<>a) dob:=b mod 403219+1;h1:=b;
end;
beginreadln(n);for i:=1 to n dobeginreadln(a[i,1],a[i,2]);j:=h0(a[i,2]);if h[j]<>a[i,2] thenbeginm:=m+1;x[j]:=m;h[j]:=a[i,2];y[x[j]]:=y[x[j]]+1;endelsey[x[j]]:=y[x[j]]+1;j:=h1(a[i,1]);if hh[j]<>a[i,1] thenbeginm1:=m1+1;x1[j]:=m1;hh[j]:=a[i,1];y1[x1[j]]:=y1[x1[j]]+1;endelsey1[x1[j]]:=y1[x1[j]]+1;end;for i:=1 to n doans:=ans+(y[x[h0(a[i,2])]]-1)*(y1[x1[h1(a[i,1])]]-1);writeln(ans);
end.



  相关解决方案