http://acm.hdu.edu.cn/showproblem.php?pid=2141
题目描述:
给你3个数组,要求能否从这3个数组中各选择一个数使得三个数的和为s
分析:
1<=L, N, M<=500, 1<=S<=1000
第一次没注意看查询次数直接 n2logn ,毫无悬念的超时(…自己还是这么水)
第二次先用sum[]保存所有a数组与b数组可能的和,去重,然后在c数组里查找s-sum[i], 继续TLE
第三次在sum数组里查找s-c[i] - AC
cf蓝名,bc蓝名 我该怎么办???
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,n) for(int i=0;i<(n);++i)
typedef long long ll;
const int MAXN=510;
using namespace std;
ll a[MAXN],b[MAXN],c[MAXN],sum[MAXN*MAXN];
ll n,m,k,s;
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.cpp","r",stdin);
#endif // ONLINE_JUDGE
int q,cas=1;
while(scanf("%I64d%I64d%I64d",&n,&m,&k)!=EOF){
rep(i,n) scanf("%I64d",&a[i]);
rep(i,m) scanf("%I64d",&b[i]);
rep(i,k) scanf("%I64d",&c[i]);
int cnt=0;
rep(i,n)rep(j,m){
sum[cnt++]=a[i]+b[j];
}
sort(c,c+k);
sort(sum,sum+cnt);
int t=unique(sum,sum+cnt)-sum;
scanf("%d",&q);
bool flag;
printf("Case %d:\n",cas++);
while(q--){
scanf("%I64d",&s);
if(sum[0]+c[0]>s||sum[t-1]+c[k-1]<s){
puts("NO");
continue;
}
flag=false;
rep(i,k)
if(binary_search(sum,sum+t,s-c[i])) flag=true;
if(!flag) puts("NO");
else puts("YES");
}
}
return 0;
}