poj2785

来源:互联网 发布:最好企业网络投资理财 编辑:程序博客网 时间:2024/04/30 08:29

二分法

#include<iostream>#include<stdio.h>#include<algorithm>using namespace std;int s[4002][4],x[4000*4000],y[4000*4000];int bin(int key,int b[],int n);int main(){int n,i,j;scanf("%d",&n);for(i=0;i<n;i++)for(j=0;j<4;j++)scanf("%d",&s[i][j]);int cnt1=0,cnt2=0;for(i=0;i<n;i++){for(j=0;j<n;j++){    x[cnt1++]=s[i][0]+s[j][1];    y[cnt2++]=s[i][2]+s[j][3];}}sort(y,y+cnt2);int sum=0;for(i=0;i<cnt1;i++){sum+=bin(-x[i],y,n*n);}printf("%d\n",sum);return 0;}int bin(int key,int b[],int n){int low=0,high=n-1,mid,ans=0;while(low<=high){mid=(low+high)>>1;if(key==b[mid]){/*ans++;int t=mid;while(t>0&&key==b[--t])  ans++;while(mid<n-1&&key==b[++mid])  ans++;*///用此方法TLEfor(ans=0;low<n;low++){if(b[low]==key)ans++;else if(ans!=0&&b[low]!=key) break;}}else if(key>b[mid])low=mid+1;else high=mid-1;}return ans;}

也可用hash链地址法处理,每个不同的值都作为一个边节点,hash地址相同的值连成链

#include<iostream>#include<stdio.h>#include<algorithm>using namespace std;int s[4002][4];struct node{int v,num,next;}edge[3999971];int hh[3999971];//哈希表int hash(int m){return (m+3899971)%3999971;}int tot=0;void add_edge(int m){int s=hash(m);//得到哈希地址for(int i=hh[s];i!=-1;i=edge[i].next){if(edge[i].v==m){edge[i].num++;return;}}edge[tot].v=m;edge[tot].num=1;edge[tot].next=hh[s];//通过链连接处理冲突,指向上一个链编号hh[s]=tot++;//hh[]存储当前链的编号}int find1(int m){int s=hash(m);for(int i=hh[s];i!=-1;i=edge[i].next){if(edge[i].v==m)return edge[i].num;}return 0;}int main(){int n,i,j;scanf("%d",&n);memset(hh,-1,sizeof(hh));for(i=0;i<n;i++)for(j=0;j<4;j++)scanf("%d",&s[i][j]);for(i=0;i<n;i++)for(j=0;j<n;j++)add_edge(s[i][0]+s[j][1]);long ans=0;for(i=0;i<n;i++)for(j=0;j<n;j++)ans+=find1(-s[i][2]-s[j][3]);cout<<ans<<endl;return 0;}



0 0
原创粉丝点击