题意:已知三个序列A, B, C,求序列中是否存在Ai, Bi, Ci 满足 Ai + Bi + Ci = X。X为给出的一个数
解法:二分Ai+Bi集合,是否存在X - Ci
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int MaxN = 510;
int L, M, N;
long long a[MaxN], b[MaxN], c[MaxN];
long long ab[MaxN * MaxN];
bool bSearch(long long d[], int n, long long x) {
if(n == 0) {
return false;
}
int k = n / 2;
if(d[k] == x)
return true;
else if(d[k] > x)
return bSearch(d, k, x);
else
return bSearch(d + k + 1, k, x);
}
int main() {
int cnt = 1;
while(scanf("%d%d%d", &L, &M, &N) != EOF) {
printf("Case %d:\n", cnt++);
for(int i = 0; i < L; i++)
scanf("%lld", &a[i]);
for(int i = 0; i < M; i++)
scanf("%lld", &b[i]);
for(int i = 0; i < N; i++)
scanf("%lld", &c[i]);
int tot = 0;
for(int i = 0; i < L; i++) {
for(int j = 0; j < M; j++) {
ab[tot++] = a[i] + b[j];
}
}
sort(ab, ab + tot);
int S;
scanf("%d", &S);
while(S--) {
long long X;
scanf("%lld", &X);
bool flag = false;
for(int i = 0; i < N; i++) {
long long temp = X - c[i];
if(bSearch(ab, tot, temp)) {
puts("YES");
flag = true;
break;
}
}
if(!flag)
puts("NO");
}
}
return 0;
}