您的位置:首页 > 其它

poj 1971 Parallelogram Counting

2011-04-07 19:09 381 查看
这题本想用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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: