#include <iostream> using namespace std; const int N = 200010; int n, a[N], d[N]; int main() { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; d[1] = 1, d[2] = -1; for (int i = 1; i <= n; i++) { int l = i + 1, r = i + a[i]; if (r < l) continue; d[l] += 1; if (r <= n) d[r + 1] -= 1; } int s = 0; for (int i = 1; i <= n; i++) { s += d[i]; if (s <= 0) { cout << "false"; return 0; } } cout << "true"; return 0; } // 64 位输出请用 printf("%lld")
差分解法。遍历1-n的位置,遍历到第i个位置时,区间[i + 1, i + a[i]]的所有值都加上1。最后算每个位置的累加值,如果位置i的累加值为0,说明从前面位置不可能跳到i,直接输出false即可(因为跳不到i,就不可能跳到后续位置)。如果累加值一直大于0,说明能跳到最后,输出true。