hdu4907:http://acm.hdu.edu.cn/showproblem.php?pid=4907
题意:中文题。
题解:这一道水题,自己调了很久,并且没有注意到序列可能是乱序的,wa了好几次。我的做法就是,把间距大于=2的数的下标放进set,然后查询的时候,lower_bond一下,找到开始的下标,然后在set中找到第一个间距的下标,即可,注意要处理好边界问题。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<set> 6 using namespace std; 7 const int N=2e5+10; 8 int a[N],n,m,t; 9 int main(){ 10 int cas; 11 scanf("%d",&cas); 12 while(cas--){ 13 scanf("%d%d",&n,&m); 14 memset(a,0,sizeof(a)); 15 set<int>Q; 16 for(int i=1;i<=n;i++){ 17 scanf("%d",&a[i]); 18 } 19 sort(a+1,a+n+1); 20 for(int i=1;i<=n;i++){ 21 if(i>1) 22 if(a[i]-a[i-1]>=2) 23 Q.insert(i-1); 24 } 25 for(int i=1;i<=m;i++){ 26 scanf("%d",&t); 27 if(t>a[n]+1)printf("%d ",t); 28 else if(t<a[1])printf("%d ",t); 29 else{ 30 int temp=lower_bound(a+1,a+n+1,t)-a; 31 if(a[temp]>t&&temp>1)temp--; 32 set<int>::iterator it=Q.lower_bound(temp); 33 if(it==Q.end()) 34 printf("%d ",a[n]+1); 35 else{ 36 printf("%d ",max(a[(*it)]+1,t)); 37 } 38 } 39 } 40 } 41 }