http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1996
一定要用哈希表才能过,连map都不行。。
#include<iostream> #include<algorithm> #include<string> #include<map> #include<cmath> #include<string.h> #include<stdlib.h> #include<cstdio> #define ll long long using namespace std; int x[505],y[505],z[505]; //【hashmap模板,只适用于判断某数是否存在,不能计个数 】 const int maxn=505*505; const int hashh=1000007; struct hashhmap { int a[maxn]; int head[hashh]; int next[maxn]; int size; void init() { memset(head,-1,sizeof(head)); size=0; } bool find(int val) { int tmp=(val%hashh+hashh)%hashh; for(int i=head[tmp];i!=-1;i=next[i]) { if(val==a[i])return true; } return false; } void add(int val) { int tmp=(val%hashh+hashh)%hashh; if(find(val))return ; a[size]=val; next[size]=head[tmp];//令next指向-1、 head[tmp]=size++; } }ha; int main(){ int n,m,h; int a; int cnt=0; while(scanf("%d%d%d",&n,&m,&h)!=EOF){ printf("Case %d:\n",++cnt); // map<ll,int> r,r1,r2,r3; ha.init(); for(int i=0;i<n;++i){ scanf("%d",&x[i]); } for(int i=0;i<m;++i){ scanf("%d",&y[i]); } for(int i=0;i<h;++i){ scanf("%d",&z[i]); } for(int i=0;i<n;++i){ for(int j=0;j<m;++j){ ha.add(x[i]+y[j]); } } int p;scanf("%d",&p); while(p--){ scanf("%d",&a); int u=0; for(int i=0;i<h;++i){ if(ha.find(a-z[i])==true){ u=1; break; } } if(u==1) printf("YES\n"); else printf("NO\n"); } } return 0; }
#include<iostream> #include<algorithm> #include<string> #include<map> #include<cmath> #include<string.h> #include<stdlib.h> #include<cstdio> #define ll long long using namespace std; int x[505],y[505],z[505]; int main(){ int n,m,h; int a; int cnt=0; while(scanf("%d%d%d",&n,&m,&h)!=EOF){ printf("Case %d:\n",++cnt); map<ll,int> r,r1,r2,r3; for(int i=0;i<n;++i){ scanf("%d",&x[i]); } for(int i=0;i<m;++i){ scanf("%d",&y[i]); } for(int i=0;i<h;++i){ scanf("%d",&z[i]); } for(int i=0;i<n;++i){ for(int j=0;j<m;++j){ r[x[i]+y[j]]=1; } } int p;scanf("%d",&p); while(p--){ scanf("%d",&a); int u=0; for(int i=0;i<h;++i){ if(r.count(a-z[i])>0){ u=1; break; } } if(u==1) printf("YES\n"); else printf("NO\n"); } } return 0; }