改变数组元素(C语言)

给定一个空数组 V和一个整数数组 a1,a2,…,an

现在要对数组 V进行 n次操作。

第 i次操作的具体流程如下:

  1. 从数组 V尾部插入整数 00。
  2. 将位于数组 V末尾的 ai个元素都变为 11(已经是 11 的不予理会)。

注意:

  • ai可能为 00,即不做任何改变。
  • ai可能大于目前数组 V所包含的元素个数,此时视为将数组内所有元素变为 11。

请你输出所有操作完成后的数组 V。

输入格式

第一行包含整数 T,表示共有 T组测试数据。

每组数据第一行包含整数 n。

第二行包含 n个整数 a1,a2,…,an。

输出格式

每组数据输出一行结果,表示所有操作完成后的数组 V,数组内元素之间用空格隔开。

数据范围

1≤T≤20000
1≤n≤2×10^5
0≤ai≤n
保证一个测试点内所有 n的和不超过 2×10^5。

输入样例:

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

输出样例:

1 1 0 1 1 1
0 1 1 1 1 1 0 0 1 1
0 0 0
#include<stdio.h>
#include<string.h>
#define N 200010

int min(int a, int b);

int main() {
	int b[N];
	int T, n, m;
	scanf("%d", &T);
	while (T--) {
		scanf("%d", &n);
		memset(b, 0, (n + 1) * 4);
		for (int i = 1; i <= n; i++) {
			scanf("%d", &m);
			m = min(i, m);
			int l = i - m + 1, r = i;
			b[l]++;
			b[r + 1]--;
		}
		for (int i = 1; i <= n; i++) {
			b[i] += b[i - 1];
		}
		for (int i = 1; i <= n; i++) {
			printf("%d ", !!b[i]);
		}
		printf("\n");
	}
	return 0;
}

int min(int a, int b) {
	if (a < b)
		return a;
	return b;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值