题目传送门
(洛谷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~