给定一个空数组 V和一个整数数组 a1,a2,…,an
现在要对数组 V进行 n次操作。
第 i次操作的具体流程如下:
- 从数组 V尾部插入整数 00。
- 将位于数组 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;
}