题目大意:

给定1000个点,求有多少组4个点可以形成平行四边形

 

这里可以找到一个特别关键的点在于如果能形成平行四边形,2个点的中点必然相交

那么只要将所有点的中点都计算出来,然后排个序计算出现的次数即可,这里算中点可能会出现小数,可以直接不除以2,这样是中点的2倍也没问题

 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <string>
 5 #include <algorithm>
 6 #include <vector>
 7 #include <map>
 8 #include <stack>
 9 #include <iomanip>
10 using namespace std;
11 #define N 1005
12 #define MOD 10007
13 #define ll long long
14 
15 struct Point{
16     int x , y;
17     bool operator<(const Point &m) const{
18         return x<m.x || (x==m.x&&y<m.y);
19     }
20     bool operator==(const Point &m) const{
21         return x==m.x&&y==m.y;
22     }
23 }p[N] , tmp[N*N];
24 
25 map<Point , int> m;
26 
27 int solve(int k)
28 {
29     sort(tmp , tmp+k);
30     int ret = 0 , cur=1;
31     for(int i=1 ; i<k ; i++){
32         if(!(tmp[i]==tmp[i-1])){
33             ret += cur*(cur-1)/2;
34             cur = 1;
35         }
36         else cur++;
37     }
38     return ret;
39 }
40 
41 int main()
42 {
43     #ifndef ONLINE_JUDGE
44         freopen("a.in" , "r" , stdin);
45     #endif // ONLINE_JUDGE
46     int T;
47     scanf("%d" , &T);
48     while(T--)
49     {
50         int n;
51         scanf("%d" , &n);
52         for(int i=0 ; i<n ; i++)
53             scanf("%d%d" , &p[i].x , &p[i].y);
54         int k=0;
55         for(int i=0 ; i<n ; i++){
56             for(int j=i+1 ; j<n ; j++){
57                 Point t;
58                 t.x = p[i].x+p[j].x;
59                 t.y = p[i].y+p[j].y;
60                 tmp[k++] = t;
61             }
62         }
63         printf("%d\n" , solve(k));
64     }
65     return 0;
66 }

 

 posted on 2015-06-01 16:47  Love风吟  阅读(259)  评论(0编辑  收藏  举报