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