1058 - Parallelogram Counting PDF (English)StatisticsForum Time Limit: 2 second(s)Memory Limit: 32 MB
There are n distinct points in the plane, given by their integer coordinates. Find the number of parallelograms whose vertices lie on these points. In other words, find the number of 4-element subsets of these points that can be written as {A, B, C, D} such that AB || CD, and BC || AD. No four points are in a straight line.
Input starts with an integer T (≤ 15), denoting the number of test cases.
The first line of each test case contains an integer n (1 ≤ n ≤ 1000). Each of the next n lines, contains 2 space-separated integers x and y (the coordinates of a point) with magnitude (absolute value) of no more than1000000000.
For each case, print the case number and the number of parallelograms that can be formed.
2
6
0 0
2 0
4 0
1 1
3 1
5 1
7
-2 -1
8 9
5 7
1 1
4 8
2 0
9 8
Case 1: 5
Case 2: 6
很明显看了别人的想法才知道这样子,其实平行四边形你会发现,2条对角线的中点相等,我们就可 以应用这个特点,中点坐标出现一次就代表着一条对角线,只有出现2次中点坐标才会有一个平行四边形 当然出现3次中点坐标,任意的2个就可以组成一个平行四边形,我们可以运用组合
#include<cstdio> #include<algorithm> using namespace std; #define maxn 1000*1000/2 struct node { double x; double y; }arr[maxn];//存中点坐标 double a[1000+11]; double b[1000+11]; bool cmp(node c,node d)//对中点坐标进行排序 { if(c.x==d.x) return c.y<d.y; return c.x<d.x; } int main() { int t,test=1; scanf("%d",&t); while(t--) { int n,i,j; scanf("%d",&n); for(i=0;i<n;++i) scanf("%lf%lf",&a[i],&b[i]); int k=0; for(i=0;i<n;++i) { for(j=i+1;j<n;++j) { arr[k].x=(a[i]+a[j])/2.0; arr[k++].y=(b[i]+b[j])/2.0; } } sort(arr,arr+k,cmp); int sum=1,ans=0; for(i=0;i<k;) { for(j=i+1;j<k;++j) { if(arr[i].x==arr[j].x&&arr[i].y==arr[j].y) ++sum; else break; } i=j; if(sum>=2) ans+=sum*(sum-1)/2; sum=1; } printf("Case %d: %d\n",test++,ans); } return 0; }