• POJ 1971 Parallelogram Counting (Hash)


                   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);
        }
    }
    

      

     
  • 相关阅读:
    认识Java数组(一)
    Java之定时任务详解
    Java三大特征之多态(三)
    Java三大特征之继承(二)
    Java三大特征之封装(一)
    eclipse常用快捷键汇总
    JDK动态代理
    Java代理模式——静态代理模式
    CRISPR/Cas9基因敲除原理及实验建议
    MicroRNA 详解
  • 原文地址:https://www.cnblogs.com/ZGQblogs/p/9452016.html
Copyright © 2020-2023  润新知