题目描述 Description
给出n个正整数,然后有m个询问,每个询问一个整数,询问该整数是否在n个正整数中出现过。
输入描述 Input Description
第一行两个整数 n 和m。
第二行n个正整数(1<=n<= 100000)
第三行m个整数(1<=m<=100000)
输出描述 Output Description
一共m行,若出现则输出YES,否则输出NO
样例输入 Sample Input
4 2
2 1 3 4
1 9
样例输出 Sample Output
YES
NO
数据范围及提示 Data Size & Hint
所有数据都不超过10^8
在对于询问进行处理时,最简单的方法进行查找是O(n)即在数组里一个个查询,而这样速度很慢,虽然可以进行二分但时间复杂度依然是logn。
这时我们就要时用哈希表,取每个元素的值为key值,对10007(或者另个较大的质数)取mod进行记录,这样即可O(1)查询
但对于每个数a,hash(a)可能相同而用vector进行记录即可防止重复
查询时与记录过程类似,不做赘述。
#include<cstdio> #include<vector> using namespace std; const int mod=10007; int hash(int x) { return x%mod; } vector<int>x[10009];//不定长数组以防止出现重复 int main() { int n,m; scanf("%d%d",&n,&m); while(n--) { int a; scanf("%d",&a); x[hash(a)].push_back(a);//对于每个值将其转为hash(a)。 } while(m--) { int a,t,pd=0; scanf("%d",&a); t=hash(a); for(int j=0;j<x[t].size();j++) if(x[t][j]==a) pd=1; if(pd) printf("YES\n"); else printf("NO\n"); } return 0; }