zoukankan      html  css  js  c++  java
  • POJ 1971 Parallelogram Counting

    Parallelogram Counting
    Time Limit: 5000MS   Memory Limit: 65536K
    Total Submissions: 5605   Accepted: 1885

    Description

    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

    The first line of the input contains a single integer t (1 <= t <= 10), the number of test cases. It is followed by the input data for each test case. 
    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

    Output should contain t lines. 
    Line i contains an integer showing the number of the parallelograms as described above for test case i. 

    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
    

    Sample Output

    5
    6
    题目大意:给定n个点的坐标,问n个点能够组成多少个平行四边形。
    #include <stdio.h>
    #include <iostream>
    #include <algorithm>
    #include <stdlib.h>
    using namespace std;
    
    typedef struct _point
    {
        int x;
        int y;
    }_Point;
    
    _Point p[1000100];
    _Point temp[1010];
    
    bool cmp(const _Point& point1, const _Point& point2)
    {
        if (point1.x == point2.x)
        {
            return point1.y > point2.y;
        }
        else
        {
            return point1.x > point2.x;
        }
    }
    
    int main()
    {
        int N;
        scanf("%d", &N);
        while(N--)
        {
            int n;
            scanf("%d", &n);
            int nCount = 0;
            for (int i = 0; i < n; i++)
            {
                scanf("%d%d", &temp[i].x, &temp[i].y);
            }
            for (int i = 0; i < n; i++)
            {
                for (int j = i + 1; j < n; j++)
                {
                    p[nCount].x = temp[i].x + temp[j].x;
                    p[nCount++].y = temp[i].y + temp[j].y;
                }
            }
            sort(p, p + nCount, cmp);
            int k = 1;
            int sum = 0;
            for (int i = 0; i < nCount; i++)
            {
                if (p[i].x == p[i + 1].x && p[i].y == p[i + 1].y)
                {
                    k++;
                }
                else
                {
                    sum += (k - 1) * k / 2;
                    k = 1;
                }
            }
            printf("%d
    ", sum);
        }
        return 0;
    }
  • 相关阅读:
    树上莫队学习笔记
    点分治学习笔记
    7.11总结
    线段树合并学习笔记
    7.10总结
    bzoj1201: [HNOI2005]数三角形----递推+bitset
    bitset(01串)优化
    Tarjan系列1
    bsgs(Baby Steps Giant Steps)算法
    [SD2015]序列统计——solution
  • 原文地址:https://www.cnblogs.com/lzmfywz/p/3196718.html
Copyright © 2011-2022 走看看