Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 6228 | Accepted: 2142 |
Description
Input
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
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
56
这题利用平行四边形的性质中点到对角线的距离相等来求然后排序
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int N = 10000000; struct node { int x, y; }p[N]; struct mid { int x, y; }q[N]; int cmp(mid a,mid b) { if(a.x!=b.x) { return a.x<b.x; } else { return a.y<b.y; } } int main() { int t; scanf("%d", &t); while(t--) { int n; scanf("%d", &n); for(int i=0;i<n;i++) { scanf("%d %d",&p[i].x, &p[i].y); } int num=0; for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { int x=(p[i].x+p[j].x),y=(p[i].y+p[j].y); q[num].x=x,q[num].y=y; num++; } } sort(q,q+num,cmp); int sum=0,cnt=1; int x=q[0].x,y=q[0].y; for(int i=1;i<num;i++) { if(q[i].x==x&&q[i].y==y) { cnt++; } else { sum+=(cnt)*(cnt-1)/2; x=q[i].x,y=q[i].y; cnt=1; } } if(cnt!=1) { sum+=(cnt)*(cnt-1)/2; } printf("%d\n",sum); } return 0; }