Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 5799 | Accepted: 1955 |
Description
Input
Output
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
Source
#include <stdio.h> #include <string.h> #include <stdlib.h> struct node{ int x; int y; }a[1100]; struct node1//定义中点hash表。//平行四边形的性质,对角线交点为两对角线中点。所以两条线段中点重合就能构成平行四边形。 { int x; int y; }zd[1100000];//事实证明用qsort 对int类型排序时间 优于 double类型排序; int cmp(const void *a,const void *b) { struct node *aa=(node *)a; struct node *bb=(node *)b; if((aa->x)!=(bb->x)) return((aa->x)-(bb->x)); else return((aa->y)-(bb->y)); } int main() { int t, n; int i, j, k; int m, sum; scanf("%d", &t); while(t--) { scanf("%d", &n); for(i=0; i<n; i++) scanf("%d%d", &a[i].x, &a[i].y); k = 0; for(i=0; i<n; i++) { for(j=i+1; j<n; j++) { zd[k].x = a[i].x + a[j].x; zd[k].y = a[i].y + a[j].y;//之所以不直接存中点坐标是因为排序时间问题。 k++; } } qsort(zd, k, sizeof(zd[0]), cmp); m = 1; sum = 0; for(i=1; i<k; i++) { if((zd[i].x==zd[i-1].x) && (zd[i].y==zd[i-1].y))//统计同一中点的线段共有m条,所以能构成m*(m-1)/2个平行四边形。 m++; else { m = m*(m-1)/2; sum += m; m = 1; } } printf("%d\n", sum); } return 0; }