题目
题解思路
一开始用的是记录区间的方法,再将区间从左右都小的方法排序,然后不断更新最右边的1的指针就行了(默认为0,即为空),然后输出就AC了。
也想过用差分,但是差分数值只想到取模就整懵了。
但是闫总直接差分某点的更新次数,这样只要看更新次数是否大于1就行了。
果然还是思维的差距。
AC代码
差分
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int a[200100];
int main ()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
memset(a,0,(n+1)*4);
for (int i = 1 ; i <= n ; i++ )
{
int k;
cin>>k;
if (k)
{
if (k>i)
{
a[1]++;
a[i+1]--;
}else
{
a[i-k+1]++;
a[i+1]--;
}
}
}
for (int i = 1 ; i <= n ; i++ )
{
a[i]+=a[i-1];
printf("%d ",!!a[i]);
}
printf("\n");
}
return 0;
}
区间暴力处理法
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct node
{
int l,r;
}a[200100];
bool cmp(node A ,node B)
{
if ( A.l == B.l )
return A.r < B.r;
return A.l < B.l;
}
int main ()
{
int t;
cin>>t;
while(t--)
{
int n,pit = 0 ;
cin>>n;
for (int i = 1 ; i <= n ; i++ )
{
int k;
cin>>k;
if (k)
{
if (k>i)
{
a[pit].l = 1;
a[pit].r = i;
pit++;
}else
{
a[pit].l = i-k+1;
a[pit].r = i;
pit++;
}
}
}
sort(a,a+pit,cmp);
int p = 0;
for (int i = 0 ; i <pit ; i++ )
{
if (a[i].l > p)
{
for (int j = p+1 ; j < a[i].l ; j++ )
cout<<"0 ";
for (int j = a[i].l ; j <= a[i].r ; j++ )
cout<<"1 ";
p = a[i].r;
}else if (a[i].r > p )
{
for (int j = p+1 ; j <= a[i].r ; j++ )
cout<<"1 ";
p = a[i].r;
}
}
if (p < n)
{
for (int i = p+1 ; i <= n ; i++ )
cout<<"0 ";
}
cout<<"\n";
}
return 0;
}