1058 - Parallelogram Counting

1058 - Parallelogram Counting
PDF (English) Statistics Forum
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
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 than 1000000000.

Output
For each case, print the case number and the number of parallelograms that can be formed.

Sample Input
Output for Sample Input
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

平行四邊形的判定定理:

兩組對邊分別平行的四邊形是平行四邊形(定義判定法);
一組對邊平行且相等的四邊形是平行四邊形;
兩組對邊分別相等的四邊形是平行四邊形;
兩組對角分別相等的四邊形是平行四邊形(兩組對邊平行判定);
對角線互相平分的四邊形是平行四邊形。
這道題用定理5判斷。

記錄每條邊的中點座標,如果兩個邊的中點座標相同,證明這兩條邊爲一個平行四邊形的兩條對角線。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>

using namespace std;
struct node {
    int  x;int  y;
};
node di[1010];
node pare[1000010];
int n;
bool cmp(node a,node b){
    if(a.x==b.x)
        return a.y<b.y;
    return a.x<b.x;
}
int main(){
    int T,i,j,t=1;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for( i=1; i<=n;++i )
            scanf("%d %d",&di[i].x,&di[i].y);
        int k=0;
        for( i=1;i<=n;i++){
            for( j=i+1;j<=n;j++){
                pare[++k].x=di[i].x+di[j].x;
                pare[k].y=di[i].y+di[j].y;
            }
        }
        sort(pare+1,pare+k+1,cmp);
        int temp=1;
        int ans=0;
        for( i=2;i<=k;i++){
            if(pare[i].x==pare[i-1].x&&pare[i].y==pare[i-1].y)
                temp++;
            else{
                ans+=temp*(temp-1)/2;
                temp=1;
            }
        }
       printf("Case %d: %d\n",t++,ans);
    }
    return 0;
}

發佈了95 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章