改变数组元素

改变数组元素

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;
}
posted @ 2021-06-25 20:55  Treasure_lee  阅读(157)  评论(0编辑  收藏  举报