Codeforces Round #707 (Div. 2)B - Napoleon Cake

B - Napoleon Cake

原题链接

题面

This week Arkady wanted to cook some pancakes (to follow ancient traditions) and make a problem about that. But then he remembered that one can’t make a problem about stacking pancakes without working at a specific IT company, so he decided to bake the Napoleon cake instead.

To bake a Napoleon cake, one has to bake n dry layers first, and then put them on each other in one stack, adding some cream. Arkady started with an empty plate, and performed the following steps n times:

place a new cake layer on the top of the stack;
after the i-th layer is placed, pour ai units of cream on top of the stack.
When x units of cream are poured on the top of the stack, top x layers of the cake get drenched in the cream. If there are less than x layers, all layers get drenched and the rest of the cream is wasted. If x=0, no layer gets drenched.
在这里插入图片描述

Help Arkady determine which layers of the cake eventually get drenched when the process is over, and which don’t.

Input

Each test contains multiple test cases. The first line contains the number of test cases t (1≤t≤20000). Description of the test cases follows.

The first line of each test case contains a single integer n (1≤n≤2⋅105) — the number of layers in the cake.

The second line of each test case contains n integers a1,a2,…,an (0≤ai≤n) — the amount of cream poured on the cake after adding each layer.

It is guaranteed that the sum of n over all test cases does not exceed 2⋅105.

Output

For each test case, print a single line with n integers. The i-th of the integers should be equal to 1 if the i-th layer from the bottom gets drenched, and 0 otherwise.

Example

Input
3
6
0 3 0 0 1 3
10
0 0 0 1 0 5 0 0 0 2
3
0 0 0

Output
1 1 0 1 1 1 
0 1 1 1 1 1 0 0 1 1 
0 0 0 

题意

对每一层都涂上ai单位的奶油,每涂上ai单位的奶油,当前层以及一下ai - 1 层都会被涂上奶油,最后找出被涂的奶油以及未被涂上的奶油

思路

本题最简单的方法就是用差分的方法,只需计算出每次所涂的开始层数和末尾层数,最后没被涂的为0,涂的为1

代码如下

#include <iostream>
#include <string.h>
using namespace std;
const int N = 200010;
int st[N];//差分数组
int sum[N];//前缀和数组
int main(void)
{
    int t;
    cin >> t;
    while(t--)
    {
        int n;
        cin >> n;
        memset(st,0,sizeof(st));
        memset(st,0,sizeof(sum));
        int a;
        int l,r;
        for(int i=0;i<n;i++)
        {
            cin >> a;
            l = i + 1 -a;
            if(l<0)l = 0;
            r = i;
            st[l]++;
            st[r+1]--;
        }
        for(int i=0;i<n;i++){
            if(i==0)sum[i] = st[i];
            else {
                sum[i] = sum[i-1] + st[i];
            }
        }
        for(int i=0;i<n;i++)//判断所涂情况
        {
            if(sum[i]!=0)cout << "1 ";
            else cout << "0 ";
        }
        cout << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值