比较模板的二分法。。。 先枚举前两个的和,然后在结果数组里二分查找x - c[i]
#include <bits/stdc++.h>
using namespace std;
const int N = 520;
int A[N],B[N],C[N],x;
long long R[N * N];
int main()
{
int L,N,M,S,c = 0;
while(~scanf("%d%d%d",&L, &N, &M))
{
memset(A, 0, sizeof(A));
memset(B, 0, sizeof(B));
memset(C, 0, sizeof(C));
memset(R, 0, sizeof(R));
for(int i = 1; i <= L; i++) scanf("%d",&A[i]);
for(int i = 1; i <= N; i++) scanf("%d",&B[i]);
for(int i = 1; i <= M; i++) scanf("%d",&C[i]);
sort(C + 1, C + M + 1);
long long cnt = 0;
for(int i = 1; i <= L; i++)
{
for(int j = 1; j <= N; j++)
{
R[++cnt] = A[i] + B[j];
}
}
sort(R + 1, R + 1 + cnt);
printf("Case %d:\n", ++c);
cin >> S;
while(S--)
{
scanf("%d",&x);
if(x > C[M] + R[cnt] or x < C[1] + R[1])
{
printf("NO\n");
continue;
}
bool flag = false;
for(int k = 1; k <= M; k++)
{
if(binary_search(R + 1, R + 1 + cnt, x - C[k]))
{
flag = true;
break;
}
}
printf("%s\n", flag ? "YES" : "NO");
}
}
return 0;
}