Task schedule

时间:2023-03-09 19:37:50
Task schedule

hdu4907:http://acm.hdu.edu.cn/showproblem.php?pid=4907

题意:中文题。

题解:这一道水题,自己调了很久,并且没有注意到序列可能是乱序的,wa了好几次。我的做法就是,把间距大于=2的数的下标放进set,然后查询的时候,lower_bond一下,找到开始的下标,然后在set中找到第一个间距的下标,即可,注意要处理好边界问题。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
const int N=2e5+;
int a[N],n,m,t;
int main(){
int cas;
scanf("%d",&cas);
while(cas--){
scanf("%d%d",&n,&m);
memset(a,,sizeof(a));
set<int>Q;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+,a+n+);
for(int i=;i<=n;i++){
if(i>)
if(a[i]-a[i-]>=)
Q.insert(i-);
}
for(int i=;i<=m;i++){
scanf("%d",&t);
if(t>a[n]+)printf("%d\n",t);
else if(t<a[])printf("%d\n",t);
else{
int temp=lower_bound(a+,a+n+,t)-a;
if(a[temp]>t&&temp>)temp--;
set<int>::iterator it=Q.lower_bound(temp);
if(it==Q.end())
printf("%d\n",a[n]+);
else{
printf("%d\n",max(a[(*it)]+,t));
}
}
}
}
}