题目链接:Insert Zero and Invert Prefix
这道题正着考虑比较麻烦,可以考虑反着思考,显然可以发现a[n]必须为0,因为不管如何翻转,最后一位一定是0,看这一组数 11111110 ,这段是怎么改过来的?那么很明显,假设长度为x,那么在前x-1个数中p一直处于首位,此时x-1都为0,那么最后一步p=x此时前x-1个数都翻转最后一个数为0。
因此我们可以把一串数组 11001101110 看成 110 0 110 1110 那么首先记录一下每个小数组中1的个数,如果遇到0,那么输出个数,同时在后面多增加x-1个0,因为最后整个答案数组都要翻转,相当于先插入x-1个0,然后再加1个x。
代码附上:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5+5;
int a[N],b[N];
int n;
void solve(){
cin>>n;
for(int i=1;i<=n;i++)b[i]=0;
for(int i=1;i<=n;i++)cin>>a[i];
if(a[n]==1){
cout<<"NO"<<"\n";
return;
}
cout<<"YES"<<"\n";
int cnt=0;
int k=0;
for(int i=1;i<=n;i++){
if(a[i]==1){
k++;
}
else{
b[++cnt]=k;
for(int j=1;j<=k;j++){
b[++cnt]=0;
}
k=0;
}
}
for(int i=cnt;i>=1;i--)cout<<b[i]<<" ";
cout<<"\n";
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;cin>>t;
while(t--){
solve();
}
return 0;
}