题意:给你三个数列,然后q次查询,每次查询问x是否满足,能在三个数列中各取一个数之和等于x;
题解: 枚举两个序列,然后排序,二分找。
map竟然连500*500都存不下。。。 内存一支超限。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<map>
using namespace std;
const int maxn=555;
int l,n,m,s;
long long x;
int a[maxn],b[maxn],c[maxn];
int ab[maxn*maxn];
int main(){
int ca=1;
while(~scanf("%d %d %d",&l,&n,&m)){
int cnt=0;
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(int j=0;j<n;++j){
ab[++cnt]=a[i]+b[j];
}
}sort(ab+1,ab+cnt+1);
scanf("%d",&s);
printf("Case %d:\n",ca++);
while(s--){
scanf("%lld",&x);
int f,l,r;
for(int k=0;k<m;++k){
f=0,l=1,r=cnt;
while(l<=r){
int mid=(l+r)/2;
if(c[k]+ab[mid]==x) {f=1;break;}
if(l==r) break;
if(ab[mid]+c[k]>x) r=mid;
else l=mid+1;
}
if(f) break;
}
if(f) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}