HDU 2124 Can you find it?(二分)

来源:互联网 发布:淘宝怎样投诉客服 编辑:程序博客网 时间:2024/05/01 07:17

思路:

直接按照题目描述的话 n3 的复杂度有些受不了,所以我们先预处理出 a[i] + b[i] 的所有情况存在一个数组里,然后对这个数组sort,之后每次分别查询 X - c[i] 是否在那个数组里即可。

AC代码:

#include <iostream>#include <cstdio>#include <string>#include <algorithm>#define eps 0.0000000001typedef long long int lli;using namespace std;lli a[550],b[550],c[550];lli ab[300000];lli cnt;int bs(lli n){    int l = 0,r = cnt-1;    int mid = (l+r) >> 1;    while(l<=r){        mid = (l+r) >> 1;        if(ab[mid] == n){            return 1;        }        else if(n < ab[mid] ){            r = mid - 1;        }        else{            l = mid + 1;        }    }    return 0;}lli sn;lli temp;int main(){    lli l,n,m;    lli cas = 0;    while(~scanf("%lld%lld%lld",&l,&n,&m)){        cnt = 0;        cas++;        for(lli i = 1;i <= l;i++){            scanf("%lld",a+i);        }        for(lli i = 1;i <= n;i++){            scanf("%lld",b+i);        }        for(lli i = 1;i <= m;i++){            scanf("%lld",c+i);        }        for(lli i = 1;i <= l;i++){            for(lli j = 1;j <= n;j++){                ab[cnt++] = a[i]+b[j];            }        }        sort(ab,ab+cnt);        scanf("%lld",&sn);        printf("Case %lld:\n",cas);        for(int i = 1;i <= sn;i++){            scanf("%lld",&temp);            int ans = -1;            for(int i = 1;i <= m;i++){                if( bs(temp - c[i]) ){                    ans = 1;                    break;                }            }            if(ans == 1)                puts("YES");            else                puts("NO");        }    }}
1 0