贪心

首先,我们发现想要将 变成 有三种办法,但是如果 已经等于 的话,那么就只能使用 的方法。所以我们就枚举中间的数,如果 大于零那么就将 进行若干次操作,直到 等于零。最后我们检查一遍,只要有不为 的就是无解。时间复杂度

#include <iostream>
 
using namespace std;
 
const int kMaxN = 2e5 + 5;
 
int a[kMaxN], t, n, ans;
 
int main() {
  for (cin >> t; t; t--) {
    cin >> n, ans = 1;
    for (int i = 1; i <= n; i++) {
      cin >> a[i];
    }
    for (int i = 1; i <= n - 2; i++) {
      if (a[i] > 0) {
        a[i + 1] -= a[i] * 2, a[i + 2] -= a[i], a[i] = 0;
      }
    }
    for (int i = 1; i <= n; i++) {
      ans &= !a[i];
    }
    cout << (ans ? "Yes" : "No") << '\n';
  }
  return 0;
}