这题本想用hash,从MLE变到 RE,最后停留在 TLE,关键值就是中点坐标的和,用链表来解决关键值相同的情况(碰撞);最后猥琐的排序过了。 #include<iostream> using namespace std; #include<cstdlib> struct Point { int x,y; }; Point p[1005],mp[500005]; int cmp(const void *a,const void *b) { Point *p1=(Point *)a,*p2=(Point *)b; if(p1->x==p2->x) return p1->y - p2->y; else return p1->x - p2->x; } int main() { int ca,n,i,j,m,c,t; scanf("%d",&ca); while(ca--) { m=0; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y); for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) { mp[m].x=p[i].x+p[j].x; mp[m].y=p[i].y+p[j].y; m++; } qsort(mp,m,sizeof(mp[0]),cmp); j=1,c=1,t=0; while(j<m) { if(mp[j].x==mp[j-1].x&&mp[j].y==mp[j-1].y) c++; else { t+=c*(c-1)/2; c=1; } j++; } t+=c*(c-1)/2; printf("%d/n",t); } }