#include using namespace std; using ll = long long; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; vector A(N+1); for(int i = 0; i <= N; i++){ cin >> A[i]; } // 总点数 n,总度数 M ll n = 0, M = 0; for(int d = 0; d <= N; d++){ n += A[d]; M += (ll)d * A[d]; } // 必须是偶数,且 ≤ 2(n-1) (forest 无环要求) if (M % 2 || M > 2*(n-1)) { cout << "No\n"; return 0; } // 收集所有出现过的度,并按度从大到小 vector> degs; for(int d = 0; d <= N; d++){ if (A[d] > 0) degs.emplace_back(d, A[d]); } sort(degs.begin(), degs.end(), [&](auto &x, auto &y){ return x.first > y.first; }); // 前缀:K 个点,度和 sumL;后缀度和 totalSum ll K = 0, sumL = 0, totalSum = M; for(auto &blk : degs){ int d = blk.first; ll cnt = blk.second; // 把整个“度 = d”这一块加入前缀 K += cnt; sumL += (ll)d * cnt; totalSum -= (ll)d * cnt; // EG 在 k=K 处要 sumL ≤ K*(K-1) + sum_{剩余} d_j ll rhs = K*(K-1) + totalSum; if (sumL > rhs) { cout << "No\n"; return 0; } } // 全部通过 cout << "Yes\n"; return 0; }