2543. 【NOIP2011模拟9.1】直角三角形 (StandardIO)

来源:互联网 发布:wto数据库 编辑:程序博客网 时间:2024/05/16 10:21

2543. 【NOIP2011模拟9.1】直角三角形 (StandardIO)

Description

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

Input

  输入文件right.in第一行为一个整数N。
  以下N行,每行给出一个点的坐标。

Output

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

Sample Input

4

0 0

0 1

1 0

1 1

Sample Output

4

Hint

【数据规模和约定】
  30%的数据满足 N ≤ 100;
  50%的数据满足 N ≤ 1000;
  100%的数据满足0 < N ≤ 100000,所有坐标不超过32位整数范围。

思路:

找出每一个对于同一个点行和列相同的个数,然后相乘就可以了。然后全部加起来。

用哈气或二分优化都可以

程序:

const maxn=1000007;var a,b,a1,b1,x,y:array [0..maxn] of longint; i,j,n,q,p:longint; ans:int64;procedure add(x:longint);var i,j:longint;begin i:=xmod maxn; while(a1[i]<>0)and (a[i]<>x) and (i<maxn) do inc(i); a[i]:=x; inc(a1[i]);end; procedure add1(x:longint);var i,j:longint;begin i:=xmod maxn; while(b1[i]<>0) and (b[i]<>x)and (i<maxn) do inc(i); b[i]:=x; inc(b1[i]);end; function find(x:longint):longint;var i,j:longint;begin i:=xmod maxn; while(a[i]<>x) and (i<maxn) do inc(i); find:=a1[i];end; function find1(x:longint):longint;var i,j:longint;begin i:=xmod maxn; while(b[i]<>x) and (i<maxn) do inc(i); find1:=b1[i];end; begin readln(n); fori:=1 to n do begin readln(x[i],y[i]); add(x[i]);  add1(y[i]); end; fori:=1 to n do begin p:=find(x[i]); q:=find1(y[i]); ans:=ans+(p-1)*(q-1); end; writeln(ans); end.


1 0
原创粉丝点击