真的很疑惑为什么其他平台上可以ac的代码这里是全错???
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2005;
typedef pair<int,int>P;
int n,ans;
struct no
{
int x,y;
}q[N];
map<P,int>mp;
int f(int i,int j)
{
return (q[i].x-q[j].x)*(q[i].x-q[j].x)+(q[i].y-q[j].y)*(q[i].y-q[j].y);
}
signed main()
{
scanf("%lld",&n);
//1.map统计各个点出现次数
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&q[i].x,&q[i].y);
mp[{q[i].x,q[i].y}]++;
}
//2.开始枚举顶点
for(int i=1;i<=n;i++)
{
map<int,vector<int>>st;
for(int j=1;j<=n;j++)
{
int dis=f(i,j);
if(dis)st[dis].push_back(j);//存储到i点距离为dis的点,分类
}
//计算合法的数量
for(auto &x:st)
{
vector<int>&v=x.second;
int sum=(int)v.size();
ans+=sum*(sum-1)/2;
//还要再看三点共线的
int cnt=0;
for(int j=0;j<sum;j++)//遍历这里相同距离的点
{
int x1=q[i].x,y1=q[i].y;//枚举的顶点
int x2=q[v[j]].x,y2=q[v[j]].y;
int x3=2*x1-x2,y3=2*y1-y2;
cnt+=(mp[{x3,y3}]);//对于找到的这些点,取出其数量
}
ans-=(cnt/2);//因为重复计算了
}
}
printf("%lld",ans);
return 0;
}
1 回复
0 转发
0 喜欢
5 阅读



