#include <cstdio>
#include <algorithm>
#include <map>
#include <vector>
#include <cstring>
#define maxn 550
using namespace std;
int a[maxn],b[maxn],c[maxn],d[maxn*maxn];
int main()
{
// freopen("input.txt","r",stdin);
int l,m,n;int cnt=0;
while(scanf("%d%d%d",&l,&n,&m)!=EOF){
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);
for(int i=0;i<l;i++)
for(int j=0;j<n;j++)
d[i*l+j]=a[i]+b[j];
sort(d,d+l*n);
int T;cin>>T;
int s;
cout<<"Case "<<++cnt<<":"<<endl;
while(T--){
scanf("%d",&s);
bool ok=false;
for(int i=0;i<m;i++)
if(binary_search(d,d+l*n,s-c[i])) {ok=true;break;}
if(ok) printf("YES\n");else printf("NO\n");
}
}
return 0;
}
#include<stdio.h>
#include<algorithm>
using namespace std;
#define K 505
int LN[K*K];
int BinarySearch(int LN[],int h,int t)/*二分查找*/
{
int left,right,mid;
left=0;
right=h-1;
mid=(left+right)/2;
while(left<=right)
{
mid=(left+right)/2;
if(LN[mid]==t)
return 1;
else if(LN[mid]>t)
right=mid-1;
else if(LN[mid]<t)
left=mid+1;
}
return 0;
}
int main()
{
int i,j,count=1,q;
__int32 L[K],N[K],M[K],S,n,m,l;
while(scanf("%d%d%d",&l,&n,&m)!=EOF)
{
int h=0;
for(i=0;i<l;i++)
scanf("%d",&L[i]);
for(i=0;i<n;i++)
scanf("%d",&N[i]);
for(i=0;i<m;i++)
scanf("%d",&M[i]);
for(i=0;i<l;i++)
for(j=0;j<n;j++)
LN[h++]=L[i]+N[j];/*合并L和N*/
sort(LN,LN+h); /*对LN数组排序*/
scanf("%d",&S);
printf("Case %d:\n",count++);
for(i=0;i<S;i++)
{
scanf("%d",&q);/*q即为题目中的x*/
int p=0; /*p为标记,0为找不到,1为能找到*/
for(j=0;j<m;j++)
{
int a=q-M[j]; /*因为L[i]+N[j]+M[k]==q,所以q-M[k]=LN[h]*/
if(BinarySearch(LN,h,a)) /*在LN数组中查找到a*/
{
printf("YES\n");
p=1;
break;
}
}
if(!p) /*找不到a*/
printf("NO\n");
}
}
return 0;
}
![]()
1 #include <stdio.h>
2 #include <string.h>
3 #include <algorithm>
4 using namespace std;
5 const int maxn = 505;
6 const int mod = 600000;
7 const int INF = (1<<30);
8 struct node
9 {
10 int key;
11 int count;
12 }h[mod];
13 int a[maxn];
14 int b[maxn];
15 int c[maxn];
16
17 void add(int p)
18 {
19 int k = p%mod;
20 if (k < 0)
21 k += mod;
22 while (h[k].count != 0)
23 {
24 if (h[k].key == p)
25 {
26 h[k].count++;
27 break;
28 }
29 k = (k+1)%mod;
30 }
31 if (h[k].count == 0)
32 {
33 h[k].count++;
34 h[k].key = p;
35 }
36 }
37 bool find(int p)
38 {
39 int k = p%mod;
40 if (k < 0)
41 k += mod;
42 while (h[k].count!=0)
43 {
44 if (h[k].key == p)
45 return true;
46 k = (k+1)%mod;
47 }
48 return false;
49 }
50 int main()
51 {
52 int i, j,k;
53 int l, n, m, s;
54 int p;
55 int ca = 1;
56 while (scanf("%d %d %d",&l,&m,&n)!=EOF)
57 {
58 memset(h,0,sizeof(h));
59 for (i=0; i<l; i++)
60 scanf("%d",&a[i]);
61 for (i=0; i<m; i++)
62 scanf("%d",&b[i]);
63 for (i=0; i<n; i++)
64 scanf("%d",&c[i]);
65 sort(a,a+l);
66 sort(b,b+m);
67 sort(c,c+n);
68 for (i=0; i<l; i++)
69 for (j=0; j<m; j++)
70 add(a[i]+b[j]);
71 bool flag=false;
72 scanf("%d",&s);
73 printf("Case %d:\n",ca++);
74 while (s--)
75 {
76 int p;
77 scanf("%d",&p);
78 /* if (a[0]+b[0]+c[0]>p || a[l-1]+b[m-1]+c[n-1]<p)
79 {
80 printf("NO\n");
81 continue;
82 }*/
83 for (i=0; i<n; i++)
84 if (find(p-c[i]))
85 break;
86 printf("%s\n",i==n?"NO":"YES");
87 }
88 }
89 return 0;
90 }
View Code