hdu 2141(二分)

来源:互联网 发布:linux如何设置双屏显示 编辑:程序博客网 时间:2024/06/05 01:56

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2141

最近想做做水题找找感觉。。orz,水题也不好切啊。。。一开始没分析,直接暴力,可想而知,TLE。。。然后就用了二分。。。wa了好几次。。

View Code
 1 #include<iostream> 2 #include<algorithm> 3 const int MAXN=507; 4 using namespace std; 5 __int64  a[MAXN],b[MAXN],c[MAXN],d[MAXN*MAXN]; 6  7 int Binary_Search(__int64 number,int low,int high){ 8     while(low<=high){ 9         int mid=(low+high)/2;10         if(d[mid]==number)return 1;11         else if(d[mid]>number)high=mid-1;12         else low=mid+1;13     }14     return 0;15 }16 17 18 int main(){19     int L,N,M;20     int _case=1;21     while(~scanf("%d%d%d",&L,&N,&M)){22         for(int i=0;i<L;i++)scanf("%I64d",&a[i]);23         for(int i=0;i<N;i++)scanf("%I64d",&b[i]);24         for(int i=0;i<M;i++)scanf("%I64d",&c[i]);25         int l=0;26         for(int i=0;i<L;i++){27             for(int j=0;j<N;j++){28                 d[l++]=a[i]+b[j];29             }30         }31         sort(c,c+M);32         sort(d,d+l);33         int s;34         scanf("%d",&s);35         printf("Case %d:\n",_case++);36         while(s--){37             __int64 x;38             scanf("%I64d",&x);39             if(x<c[0]+d[0]||x>c[M-1]+d[l-1]){40                 printf("NO\n");41                 continue;42             }43             int flag=0;44             for(int i=0;i<M;i++){45                 __int64 tmp=x-c[i];46                 if(Binary_Search(tmp,0,l-1)){47                     flag=1;48                     break;49                 }50             }51             if(flag){52                 printf("YES\n");53             }else 54                 printf("NO\n");55         }56     }57     return 0;58 }59 60 61             62         

 

0 0
原创粉丝点击