POJ 1971 Parallelogram Counting

Posted zgqblogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1971 Parallelogram Counting相关的知识,希望对你有一定的参考价值。

               Parallelogram Counting
Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 6895   Accepted: 2423

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

思路:
没有思路。
暴力:TLE
hash:TLE
直接怀疑人生。
在此之间,我甚至怀疑了POJ是不是卡了我的map,后来改成模拟链表。。。。TLE!!
我。。。。。
TLE代码之一:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef unsigned long long ll;
const int maxn = 1024;
ll x[maxn],y[maxn];
ll state[1000086];
int head[maxn];
int num[maxn],Next[1000086];
int main()
{
    int n,T;
    ll sd;
    scanf("%d",&T);
    while(T--){
        int ans=0;
        scanf("%d",&n);
        memset(head,-1,sizeof(head));
        int t=0;
        for(int i=1;i<=n;i++){
            scanf("%lld%lld",&x[i],&y[i]);
            for(int j=1;j<i;j++){
                sd=(x[i]+x[j])*10000009+y[i]+y[j];
                int h=sd%maxn;
                for(int k=head[h];k!=-1;k=Next[k]){
                    if(state[k]==sd){ans++;}
                }
                t++;
                state[t]=sd;
                Next[t]=head[h];
                head[h]=t;
            }
        }
        printf("%d
",ans);
    }
}

  

 












以上是关于POJ 1971 Parallelogram Counting的主要内容,如果未能解决你的问题,请参考以下文章

TOJ-1313 Parallelogram Counting

Parallelogram Counting(平行四边形个数,思维转化)

LightOJ - 1058 - Parallelogram Counting(数学,计算几何)

lightoj-1305 - Area of a Parallelogram(几何)

1971年3月1日,哪年是55周岁?

poj1743 后缀数组, poj挂了 存个代码