Codeforces Round 707 (Div. 2, based on Moscow Open Olympiad in Informatics) B. Napoleon Cake

发布时间 2023-10-10 17:33:21作者: zsxuan

按以下 \(n\) 次操作制作蛋糕。

  • 叠上第 \(i\) 块面包,然后浇上 \(a_i\) 单位的奶油。可以使当前往下 \(a_i\) 块面包沾上奶油。

输出空格隔开的 \(n\) 个数,第 \(i\) 个的 \(0/1\) 代表第 \(i\) 块面包是否沾有奶油。

比较显然的思路可以进行差分修改。

view1
#include <bits/stdc++.h>
void solve(){
	int n; std::cin >> n;
	std::vector<int> a(n+2);
	for (int i = 1; i <= n; i++) {
		int d; std::cin >> d;
		int l = std::max(1, i - d + 1), r = i;
		a[l] += 1;
		a[r + 1] -= 1;
	}
	for (int i = 1; i <= n; i++) a[i] += a[i - 1];
	for (int i = 1; i <= n; i++) std::cout << (a[i] == 0 ? 0 : 1) << " \n"[i==n];
}
int main() {
	int _ = 1;  std::cin >> _;
	while (_--) {solve();}
	return 0;
}

观察到每次修改只会往左一段修改,于是可以从右往左逆序统计。维护 \(cur\) 即当前位置往左需要浸透多少面包。

view2
#include <bits/stdc++.h>
void solve(){
	int n; std::cin >> n;
	std::vector<int> a(n+1), ans(n+1);
	for (int i = 1; i <= n; i++) std::cin >> a[i];
	int cur = 0;
	for (int i = n; i; --i) {
		cur = std::max(cur, a[i];)
		if (cur > 0) cur -= 1, ans[i] = 1;
	}
	for (int i = 1; i <= n; i++) std::cout << ans[i] << " \n"[i==n];
}
int main() {
	int _ = 1;  std::cin >> _;
	while (_--) {solve();}
	return 0;
}