题目:3729. 改变数组元素
题解:从最右边开始,每次保存最左边1的下标idx,然后判断当前坐标i是在idx的右边(a[i]=1)还是左边(a[i]=0)。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int ,int> PII;
const int N=2e5+10;
const int mod=100000007;
int main(){
int T;
cin>>T;
while(T--){
int n;
cin>>n;
int a[N];
for(int i=0;i<n;i++)
cin>>a[i];
int idx=N;//最左边的1的位置
for(int i=n-1;i>=0;i--){
if(a[i]){
idx=min(idx,i-a[i]+1);
}
if(idx<=i) a[i]=1;
else a[i]=0;
}
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
return 0;
}