【题解】洛谷 P6355 [COCI2007-2008#3] DEJAVU

题目传送门

(洛谷P6355)

https://www.luogu.com.cn/problem/P6355

题目大意

给出坐标系中的 n个点,求以不同的三个点组成的 直角边与坐标轴平行的直角三角形个数。

分析

由题意可以知道:如果我们设符合要求的三角形直角顶点坐标为 A(x1,y1),那么剩下两点坐标一定为 B(x1,yi)、 C(xj,y1)。所以,如果我们确定一个点为直角顶点,那么可以与之配合成为目标三角形的只有是横、纵坐标都与之相同的点。

由此,我们可以考虑用两个数组 sumx、 sumy来记录一个横坐标或纵坐标上的点的个数,明显的,当直角顶点为 A(x1,y1)时,可以组成的目标三角形个数为

(sumx(x1)−1)×(sumy(y1)−1)

(注:-1是减去当前所在的点)

由此,我们可以枚举每个点,取出它所在的横、纵坐标,用上面的公式计算出在这个点可以组成的目标三角形个数,累加起来,就是答案啦~

分析结束,上代码!

Code

P.S.: 3≤n<105,日常爆int,不开long long两行泪。

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const int M=100005;
 5 struct node{
 6     ll x,y;
 7 }p[M];
 8 int n;
 9 ll sx[M],sy[M];
10 ll ans=0;
11 int main()
12 {
13     scanf("%d",&n);
14     for(int i=1;i<=n;i++){
15         scanf("%lld%lld",&p[i].x,&p[i].y);
16         sx[p[i].x]++;
17         sy[p[i].y]++;
18     }
19     for(int i=1;i<=n;i++)
20         ans+=(sx[p[i].x]-1)*(sy[p[i].y]-1);
21     printf("%lld",ans);
22     return 0;
23 }


完结撒fa~

posted @ 2020-10-12 13:05  SingularPoint  阅读(181)  评论(0编辑  收藏  举报