题目
给定一个空数组 和一个整数数组 。
现在要对数组 进行 次操作。
第 次操作的具体流程如下:
- 从数组 尾部插入整数 。
- 将位于数组 末尾的 个元素都变为 (已经是 的不予理会)。
注意:
- 可能为 ,即不做任何改变。
- 可能大于目前数组 所包含的元素个数,此时视为将数组内所有元素变为 。
请你输出所有操作完成后的数组 。
输入格式
第一行包含整数 ,表示共有 组测试数据。
每组数据第一行包含整数 。
第二行包含 个整数 。
输出格式
每组数据输出一行结果,表示所有操作完成后的数组 ,数组内元素之间用空格隔开。
数据范围
,
,
,
保证一个测试点内所有 的和不超过 。
输入样例:
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
解题
方法一:差分
思路
该题需要频繁地改变数组中一部分(一个区间)内的数,所以考虑使用差分,但和传统差分不同的是:传统差分一般都是把某个区间上的数加/减一个值,而该题是把某个区间上的数全部变为一个数 1
,所以在处理完差分数组求前缀和的时候,在前缀和等于 时输出 其它情况输出均 。
注意: 大于目前数组 所包含的元素个数,不要越界了,此时视为将数组内所有元素变为 。
代码
import java.util.*;
import java.io.*;
public class Main {
static final int N = (int) 2e5 + 10;
public static void main(String[] args) throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
in.nextToken();
int t = (int) in.nval;
while (t-- > 0) {
in.nextToken();
int n = (int) in.nval;
int[][] segs = new int[n][2];
int[] b = new int[n + 1];
for (int i = 0; i < n; ++i) {
in.nextToken();
int x = (int) in.nval;
if (x != 0) {
++b[Math.max(0, i - x + 1)];
--b[i + 1];
}
}
int curr = 0;
// Java输出太慢了 所以先把答案拼接起来再一起输出
StringBuilder ans = new StringBuilder();
for (int i = 0; i < n; ++i) ans.append((curr += b[i]) == 0 ? "0 " : "1 ");
System.out.println(ans);
}
}
}
评论区