-
描述
-
在某一国度里流行着一种游戏。游戏规则为:在一堆球中,每个球上都有一个整数编号i(0<=i<=100000000),编号可重复,现在说一个随机整数k(0<=k<=100000100),判断编号为k的球是否在这堆球中(存在为"YES",否则为"NO"),先答出者为胜。现在有一个人想玩玩这个游戏,但他又很懒。他希望你能帮助他取得胜利。
-
输入
-
第一行有两个整数m,n(0<=n<=100000,0<=m<=1000000);m表示这堆球里有m个球,n表示这个游戏进行n次。
接下来输入m+n个整数,前m个分别表示这m个球的编号i,后n个分别表示每次游戏中的随机整数k
输出
- 输出"YES"或"NO" 样例输入
-
6 4 23 34 46 768 343 343 2 4 23 343
样例输出
-
NO NO YES YES
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<map> #include<string> #include<vector> #include<queue> #include<stack> #include<set> #include<algorithm> #define N 1000005 #define mod 111123 using namespace std; int Hash[N],Next[N],Head[N]; int top; void add(int x) { int key=x%mod; Hash[top]=x;//用来存储原值 Next[top]=Head[key];//Next存储上一个具有相同余数的数的位置 Head[key]=top;//余数key的下标为top //printf("x=%d,key=%d,Hash=%d,Next=%d,Head=%d\n",x,key,Hash[top],Next[top],Head[key]); top++; } int main() { int n,m,x; top=0; memset(Head,-1,sizeof(Head)); scanf("%d%d",&n,&m); for(int i=0;i<n;i++) { scanf("%d",&x); add(x); } for(int i=0;i<m;i++) { scanf("%d",&x); int flag=0; int temp=x%mod; for(int j=Head[temp];j!=-1;j=Next[j])//寻找所有相同余数的数 { if(Hash[j]==x) { flag=1; break; } } if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }
-
第一行有两个整数m,n(0<=n<=100000,0<=m<=1000000);m表示这堆球里有m个球,n表示这个游戏进行n次。
nyoj86找球号(一)——Hash表
最新推荐文章于 2023-12-07 21:15:19 发布