虽然是几何题,但是集合的部分很少
题 意:在n个点中,有多少组三个点满足dis(a,b) = dis(b,c)
思 路:如果暴力枚举三个点,显然会超时。这时候,从题目条件出发。题目只要求两边相等的角的个数,那么考虑每个点作为角的顶点时,其他点与这个点的距离。所有相等的边中任取两条,C(n,2);
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int T,n;
struct node {
double x,y;
node (double _x=0,double _y=0) {
x = _x;y = _y;
}
};
node p[1010];
double getdis(node a,node b) {
double dx = a.x-b.x;
double dy = a.y-b.y;
dx*=dx;
dy*=dy;
return sqrt(dx+dy);
}
int main() {
cin>>T;
while(T--) {
scanf("%d",&n);
for(int i=0;i<n;i++) {
scanf("%lf%lf",&p[i].x,&p[i].y);
}
map<double,int> mp;
LL ans = 0;
for(int i=0;i<n;i++) {
mp.clear();
for(int j=0;j<n;j++) mp[getdis(p[i],p[j])]++;
map<double,int>::iterator it = mp.begin();
while(it!=mp.end()) {
ans+=(it->second-1)*(it->second);
it++;
}
}
if(ans) printf("%d\n",ans);
else puts("WA");
}
}