题目大意:给定n个点,没有4个点实在一条直线上的,问在所有点中,任取4个能构成平行四边形的有几种情况;
题目解析:假设已经知道4个点坐标,判断是否为平行四边形的时候,只需判断他们对角线是否平分即可,即判断他们对角线的重点是否重合,由此想到,要把任意两点所表示的对角线边的中点预处理出来,接着遍历一遍即可;
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
struct point
{
int x,y;
}p[1000010];
int a[1000010][2];
bool cmp(point c,point b)
{
if(c.x==b.x)
return c.y<b.y;
return c.x<b.x;
}
int main()
{
int cas,c,i,j,n,cnt;
scanf("%d",&cas);
for(c=1;c<=cas;c++)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&a[i][0],&a[i][1]);
}
cnt=0;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
p[cnt].x=a[i][0]+a[j][0];
p[cnt].y=a[i][1]+a[j][1];
cnt++;
}
}
sort(p,p+cnt,cmp);
int pos=0,sum=0,ans=0;
for(i=0;i<cnt;i++)
{
if(p[i].x==p[pos].x&&p[i].y==p[pos].y&&i!=pos)
{
ans+=sum;
sum++;
}
else
{
pos=i;
sum=1;
}
}
printf("Case %d: %d\n",c,ans);
}
return 0;
}