平行四边形

请小伙伴们对自己AC的题目进行标记,注意每人只能标记一次!不知道的不要标记,恶意标记者将回收账号!!!

问题 E: 平行四边形

时间限制: 3 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

求平面上n个点构成的平行四边形个数。

输入

一行一个数n。
接下来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);
}
原文地址:https://www.cnblogs.com/lipu123/p/12895782.html