题目大意:
有n道题目,这个人的智商只有x,如果这个人当前的智商大于等于题目难度,则可以ak这道题,反之,则需要智商减一且此时的智商是严格大于一才能ak这道题,二这个人想ak更多的题,请问他能ak哪些题?
我们可以从N 到 1 建立一个从第i个题AK 到 第N 个题所需的最少智商的阶梯数组b[i],相当于看看多少智商能从i把题目给AK穿, 如下图:
如果当前的智商大于等于题目,那么直接AK,否则,比较一下当前的智商是否大于所需的,大于的话AK 这个题, 否则,就直接跳过,防止这题AK了智商变小让后面AK 的题目变少。
//AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
ll a[maxn];
ll b[maxn];
void init(int n){
for(int i = 1; i <= n + 5; i++){
b[i] = 0;
}
}
int main(){
int t;
cin>>t;
while(t--){
int n;
ll q;
cin>>n>>q;
init(n);
for(int i = 1; i <= n; i++){
scanf("%lld", &a[i]);
}
for(int i = n; i >= 1; i--){
b[i] = b[i + 1];
if(a[i] > b[i]) b[i]++;
}
for(int i = 1; i <= n; i++){
if(q >= a[i]){
cout<<"1";
}else{
if(q >= b[i]){
q--;
cout<<"1";
}else{
cout<<"0";
}
}
}cout<<endl;
}
return 0;
}