【解题思路】:
1)平行四边形的对角线的中点一定相交。<=> 如果有两条不同线段的中点相交c;就是一个平行四边形
2)利用点坐标求出中点的集合c;离散化后求出同个中点的出现的个数k。【代码】:
<code class="language-cpp">#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <cmath> #include <string> #include <cctype> #include <map> #include <iomanip> using namespace std; #define eps 1e-8 #define pi acos(-1.0) #define inf 1<<30 #define pb push_back #define lc(x) (x << 1) #define rc(x) (x << 1 | 1) #define lowbit(x) (x & (-x)) #define ll long long struct Node{ int x,y; }node[1010],mid[1001000]; int T,n,summ,num; int cmp(const Node &a,const Node &b){ if (a.x==b.x) return a.y<b.y; else return a.x<b.x; } int count(int k){ if (k==1) return 0; else { return k*(k-1)/2; } } int main(){ cin >> T; while (T--) { summ=0; scanf("%d",&n); for (int i=1; i<=n; i++) { scanf("%d%d",&(node[i].x),&(node[i].y)); } num=-1; for (int i=1; i<=n; i++) { for (int j=i+1; j<=n; j++) { num++; mid[num].x=node[i].x+node[j].x; mid[num].y=node[i].y+node[j].y; } } sort(mid,mid+num+1,cmp); Node temp; int k; k=1; for (int i=0; i<=num; i++) { if (mid[i].x==mid[i+1].x && mid[i].y==mid[i+1].y) k++; else { summ+=count(k); k=1; } } cout << summ << endl; } return 0; } code>