对于这道题,当时在程序挑战竞赛这本书上看到过类似的
他的优化就是分治加二分,这道题也一样, 先把a,b两个数加起来进行优化
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int L,M,N,k=1,s;
int a[505],b[505],c[505],kk[250005];
int main()
{
while (cin>>L>>M>>N)
{
for (int i=0;i<L;i++)
cin>>a[i];
for (int i=0;i<M;i++)
cin>>b[i];
for (int i=0;i<N;i++)
cin>>c[i];
cin>>s;
int cnt=0;
for(int i=0;i<L;i++)
{
for(int j=0;j<M;j++)
{
kk[cnt++]=a[i]+b[j];
}
}
sort(kk,kk+cnt);
printf("Case %d:\n",k++);
while (s--)
{
bool f=false;
long long res;
cin>>res;
for (int i=0;i<N;i++)
{
int l=0,r=cnt-1;
while (r-l>1)
{
int mid=(l+r)>>1;
if(res==kk[mid]+c[i])
{
f=true;
break;
}
else if(kk[mid]+c[i]<res)
l=mid;
else r=mid;
}
}
if(f) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}