poj 1917

来源:互联网 发布:身高算法 编辑:程序博客网 时间:2024/05/16 05:43

这题一道典型的hash题,其实hash写的好的应该挺快的,不过我的4600+ms过个,比较惊险,不是爆内存就是tle,题意是给你n个点问这n个点能组成多少个平行四边形,平行四边形的性质就是对角线互相平分,那么只要找出两对角线的中点相同即可,用hash统计数目,我一边输入一边累加都快tle了,不知道用上组合数学回怎么样,还有一种做法是将其中点排序,然后统计,应该挺快的我觉的,没去实验。

#include<cstdio>#include<cstring>#include<cmath>using namespace std;const int N=1000003;int pos,head[N+2]={0};long long flag=0;struct nd{int  x,y,z;int n;}hash[N+2];void into(int x,int y){int tem;if(x+y<0){tem=-(x+y)&N;}elsetem=(x+y)&N;int k=head[tem];while(k&&(hash[k].x!=x||hash[k].y!=y)){k=hash[k].n;}if(k==0){hash[pos].x=x,hash[pos].y=y;hash[pos].z=1;hash[pos].n=head[tem];head[tem]=pos++;}else{flag+=hash[k].z;hash[k].z++;}}int main(){int c,i,j,k,m;int x[1005],y[1005];scanf("%d",&c);while(c--){memset(hash,0,sizeof(hash));memset(head,0,sizeof(head));flag=0;pos=1;scanf("%d",&m);for(i=0;i<m;i++){scanf("%d%d",&x[i],&y[i]);for(j=i-1;j>=0;j--){into(x[i]+x[j],y[i]+y[j]);}}printf("%lld\n",flag);}return 0;}


原创粉丝点击