请小伙伴们对自己AC的题目进行标记,注意每人只能标记一次!不知道的不要标记,恶意标记者将回收账号!!!
题目描述
求平面上n个点构成的平行四边形个数。
输入
一行一个数n。
接下来n行,每行两个数x,y,表示这个点的坐标为(x,y)。
保证任意两点不重合,任意三点不共线。
接下来n行,每行两个数x,y,表示这个点的坐标为(x,y)。
保证任意两点不重合,任意三点不共线。
输出
一行一个整数表示平行四边形个数。
样例输入 Copy
4
0 1
1 0
1 1
2 0
样例输出 Copy
1
提示
对于100%的数据:n≤1500。
#pragma GCC optimize(2) #include<cstdio> #include<iostream> #include<algorithm> #include<map> #include <math.h> using namespace std; typedef long long ll; //c(n,k)*c(m,k)*k! inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } const int maxn=1e5+10; const int mod=1e9+7; struct node{ double x; double y; }a[maxn]; vector<node>v; bool cmp(node a,node b){ if(a.x==b.x){ return a.y<b.y; } return a.x<b.x; } int n; void inint(){ cin>>n; for(int i=0;i<n;i++){ scanf("%lf%lf",&a[i].x,&a[i].y); } } int main(){ inint(); for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ node p; p.x=(a[i].x+a[j].x)/2,p.y=(a[i].y+a[j].y)/2; v.push_back(p); } } sort(v.begin(),v.end(),cmp); int t=1; int ans=0; int p=v.size()-1; for(int i=0;i<p;i++) { if(v[i].x==v[i+1].x&&v[i].y==v[i+1].y){ t++; } else { ans=ans+t*(t-1)/2; t=1; } } printf("%d",ans); }