题意:
给三列数,在每一个列中找个数,使之相加等于给定的x。
解:
本来想写二分的,多校曾经出过类似的,但是给的是五列数,它给了个solution,当时没用那个写,用的是哈希。于是,我就用这个类似快速查找的方法去做了,1Y,有木有。
就是搞成两列,一个指针指向第一列最小的,第二个指针指向第二列最大的,然后都往相反的方向移动。
/*
Pro: 0
Sol:
date:
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <set>
#include <vector>
const int maxn = 510;
using namespace std;
int a[maxn],b[maxn],c[maxn],bc[maxn * maxn],m,n,l,s,x,ca,sub;
bool find(int x){
int pa = 0; int pbc = sub - 1;
while(pa < l && pbc >= 0){
if(a[pa] + bc[pbc] == x) return true;
else if(a[pa] + bc[pbc] < x) pa ++;
else pbc --;
}
return false;
}
int main(){
ca = 1;
while(scanf("%d%d%d",&l,&n,&m)!= EOF){
printf("Case %d:\n",ca ++);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(bc,0,sizeof(bc));
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);
sub = 0;
for(int i = 0; i < n; i ++){
for(int j = 0; j < m; j ++){
bc[sub ++] = b[i] + c[j];
}
}
sort(a,a + l); sort(bc,bc + sub);
scanf("%d",&s);
for(int i = 0; i < s; i ++){
scanf("%d",&x);
if(find(x)) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}