HDU-2141 Can you find it? 简单二分

来源:互联网 发布:python安装错误 编辑:程序博客网 时间:2024/05/16 09:48

题目链接

题目大意:给你三个数列A,B,C  在三个数列中个取个数满足a+b+c = x;



#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<math.h>#include<algorithm>#include<vector>#include<queue>using namespace std;const int maxn = 505;const int inf = 1<<30;typedef __int64 LL;int l,n,m;int a[maxn],b[maxn],c[maxn],d[maxn*maxn];bool bsearch( int x ){int ld = 0,rd = l*n,mid;while( ld < rd ){mid = (ld+rd)>>1;if( x > d[mid] )ld = mid + 1;else if( x < d[mid] )rd = mid;elsereturn true;}return false;}bool fun( int x ){for( int i = 0; i < m; i ++ ){if( bsearch( x - c[i] ) )return true;}return false;}int main(){//freopen("data.txt","r",stdin);int cas = 1,q,x;while( scanf("%d%d%d",&l,&n,&m) != EOF ){for( int i = 0; i < l; i ++ )scanf("%d",&a[i]);for( int i = 0; i < n; i ++ )scanf("%d",&b[i]);for( int i = 0; i < m; i ++ )scanf("%d",&c[i]);for( int i = 0; i < l; i ++ )  //这里要预处理下 不然三个for妥妥的超时for( int j = 0; j < n; j ++ )d[i*n+j] = a[i] + b[j];sort( d,d+l*n );printf("Case %d:\n",cas++);scanf("%d",&q);for( int i = 0; i < q; i ++ ){scanf("%d",&x);if( fun(x) )puts("YES");elseputs("NO");}}return 0;}


0 0
原创粉丝点击