改变数组元素
改变数组元素
AcWing 3729
https://www.acwing.com/problem/content/description/3732/
思路:差分
对于每次操作等价于把区间[i-a+1,i]都变为1
但是差分是在区间[l,r]加或减一个数c
我们把变为1改为加上1,只要至少被操作过一次,那么数组元素的值就会大于等于1。
最后,我们通过前缀和求出操作后的数组,通过两次否定\(!!\)输出0和1.
代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 200005;
int T,n;
int v[N];
int main()
{
cin >> T;
while (T--)
{
cin >> n;
//memset(v,0,sizeof v);
memset(v, 0, (n + 1) * 4);//初始化n+1个元素,每个元素占用4个字节也就是32位。
for (int i = 1; i <= n; i ++ )
{
int x;
scanf("%d", &x);
int l = max(1,i-x+1), r = i;
v[l] += 1;
v[r + 1] -= 1;
}
for (int i = 1; i <= n; i ++ )
v[i] += v[i -1];
for (int i = 1; i <= n; i ++ ) cout << !!v[i] << ' ';cout << endl;
}
return 0;
}