给定 \(n\) 个石堆,第 \(i\) 个石堆高为 \(h_i\) 并且代表这堆石块的个数。在一次操作中你可以将第 \(i\) 堆中的一块石块移动(需要存在石块)到 \(i + 1\) 堆。询问是否可以使石堆的高度严格递增。
显然贪心地让第 \(1\) 堆的高度为 \(0\) 。
然后线性模拟使得第 \(1 \sim n - 1\) 的石堆高度为 \(0,1,\cdots,n-2\) 。模拟不能进行则无法构造。
最后判断第 \(n\) 堆的高度是否 \(\geq n - 1\) 。
view
#include <bits/stdc++.h>
typedef long long ll;
void solve() {
int n; std::cin >> n;
std::vector<ll> a(n+1);
for (int i = 1; i <= n; i++) std::cin >> a[i];
for (int i = 1; i < n; i++) {
if (a[i] >= i - 1) {
a[i + 1] += a[i] - (i - 1);
a[i] -= i - 1;
}
else {
std::cout << "NO" << "\n";
return;
}
}
std::cout << (a[n] >= n - 1 ? "YES" : "NO") << '\n';
}
int main() {
int _ = 1; std::cin >> _;
while(_--) { solve(); }
return 0;
}