SoL:A+B+C==X ---> A+B == X-C ---> AB == X-C。在用二分查找就行。
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 500 + 10;
int A[maxn],B[maxn],C[maxn],AB[maxn*maxn];
int h;
bool BinarySearch(int R,int ans)
{
int l,r,mid;
l=0,r=R-1;
while(l<=r)
{
mid=(l+r)>>1;
if(AB[mid]==ans)
return true;
else if(AB[mid]>ans)
r=mid-1;
else if(AB[mid]<ans)
l=mid+1;
}
return false;
}
int main()
{
int cnt=1;
int L,M,N,T;
while(~scanf("%d%d%d",&L,&M,&N))
{
printf("Case %d:\n",cnt++);
for(int i=0;i<L;i++)
scanf("%I64d",&A[i]);
for(int i=0;i<M;i++)
scanf("%I64d",&B[i]);
for(int i=0;i<N;i++)
scanf("%I64d",&C[i]);
int h=0;
for(int i=0;i<L;i++)
for(int j=0;j<M;j++)
AB[h++]=A[i]+B[j];
sort(AB,AB+h);
scanf("%d",&T);
for(int i=0;i<T;i++)
{
int q;
scanf("%d",&q);
bool flag=false;
for(int j=0;j<N;j++)
{
int ans=q-C[j];
if(BinarySearch(h,ans))
{
printf("YES\n");
flag=true;
break;
}
}
if(!flag)
printf("NO\n");
}
}
return 0;
}