大概就是去考虑当前位置的1与0所代表的a[i]对后面的影响
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define pll pair<long long,long long>
#define INF 0x7fffffff
//const int mod=
//mt19937 rnd(std::chrono::system_clock::now().time_since_epoch().count());
//uniform_int_distribution<long long> dist(0, 100000);//随机数限定范围:dist(rnd);
const int maxn=200010;
int n,a[maxn],ans[maxn];//a记录值,ans记录答案的01串
void solve()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
ans[i]=1;//默认为1,之后挖去部分
}
int pos=0;//pos记录最后一个【可确定的】0位置,是不严格单调递增的
for(int i=1;i<=n;i++)
{
if(pos<i) ans[i]=(bool)a[i];//如果在确定位置之外,通过a来判断是否为1,主要用于刚开始时判断头几个
if (ans[i]) ans[pos=a[i]+1]=0;//如果某位置是某个1串中的1,那么之后会有某段空位来放下这一串1
else ans[pos=a[i]+i]=0; //如果某位置是0,那么之后有某段空位放下之前的1串(a[i]是该位置前1串的长度)
}
for(int i=1;i<=n;i++) printf("%d ",ans[i]);
puts("");
}
signed main()
{
int test=1;
scanf("%d",&test);getchar();
while(test--)
{
solve();
}
return 0;
}