//这题的解题思路是将a b 中的元素每种相加可能的值都存放于一个数组中,如a[]={1,2,3};b={1,2} 则 ab[]={2,3,3,4,4,5};
//将ab[]中的元素进行升序排序
//将要查找的值分别减去c[]中的一个元素,然后再在ab[]中用二分查找的方式进行搜索,这样要搜索的值就有c[]元素的个数
//只要有一个值能在ab[]中查找成功,则输出 yes 反之 输出 no
// 468 ms 1940 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>
using namespace std;
vector<int> ab;
int search(int search_num){
int low=0;
int high=ab.size()-1;
int mid;
while(low<=high){
mid=(low+high)/2;
if(search_num<ab[mid]) high=mid-1;
if(search_num>ab[mid]) low=mid+1;
if(search_num==ab[mid]) return 1;
}
return 0;
}
int main(){
int x;
vector<int> a;
vector<int> b;
int l,n,m;
int s;
int cases=0;
a.reserve(500);
b.reserve(500);
ab.reserve(250000);
int c[550];
while(cin>>l>>n>>m){
a.clear();
b.clear();
ab.clear();
for(int i=0;i<l;i++){
scanf("%d",&x);
a.push_back(x);
}
for(int i=0;i<n;i++){
scanf("%d",&x);
b.push_back(x);
}
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.push_back(a[i]+b[j]);
sort(ab.begin(),ab.end());
cout<<"Case "<<++cases<<":"<<endl;
cin>>s;
for(int i=0;i<s;i++){
scanf("%d",&x);
int flag;
for(int j=0;j<m;j++){
flag=search(x-c[j]);
if(flag) break;
}
if(flag)
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
return 0;
}
Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others)
Total Submission(s): 3764 Accepted Submission(s): 939
3 3 3 1 2 3 1 2 3 1 2 3 3 1 4 10