本文最后更新于 666 天前,其中的信息可能已经有所发展或是发生改变。
思想:
- 前缀和与差分。
- 对于
a[i]
的操作,构建差分数组b[i]
记录被操作的区间。 - 利用前缀和可知所有被操作的区间,即
b[i] != 0
的区间。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 3;
int a[N], b[N];
void solve(){
int n; cin >> n;
for(int i = 1; i <= n; i ++){
b[i] = 0; //重置
cin >> a[i]; //记录操作
}
for(int i = 1; i <= n; i ++){
if(a[i] >= i) b[1] ++, b[i + 1] --; //a[i] 超出范围,则当前全部区间都被操作了
else if(a[i] < i && a[i] != 0) b[i - a[i] + 1] ++, b[i + 1] --; //否则操作后 a[i] 个数,正数为第 i - a[i] + 1 的位置开始
}
for(int i = 1; i <= n; i ++){
b[i] += b[i - 1]; //前缀和计算每个区间被操作的次数
if(b[i] != 0) cout << 1 << ' '; //不为 0 说明该位置被操作过
else cout << 0 << ' ';
}
cout << endl;
}
int main(){
int _; cin >> _;
while(_ --) solve();
return 0;
}