题目大意:中文的,就不解释了!
解题思路:直接预处理,两次哈希,一次标记是否存在,一次存储最优解。据说二分可以做的。
题目来源:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?pid=1001&cid=527
http://acm.hdu.edu.cn/showproblem.php?pid=4907
code:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 2*100005;
int tmp[MAXN];
int ti,T,n,m,q;
int vis[MAXN];
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++){
scanf("%d",&ti);
vis[ti]=1;
}
for(int i=MAXN-1;i>=0;i--){
if(!vis[i]) tmp[i]=i;
else tmp[i]=tmp[i+1];
}
while(m--){
scanf("%d",&q);
printf("%d\n",tmp[q]);
}
}
return 0;
}