inlineintrd(){ int x=0,c,f=1;while(!isdigit(c=getchar()))if(c=='-')f=-1; for(;isdigit(c);c=getchar())x=x*10+c-'0';return x*f; } constint N = 1e5+3; #define int long long
int n, a[N], f[N], d[N]; vector<int> G[N];
voiddfs(int u, int fa){ if (d[u] == 1) returnvoid(f[u] = a[u]);
int sum = 0, mx = 0; for (int v:G[u]) if (v^fa) { dfs(v, u); sum += f[v], mx = max(mx, f[v]); }
f[u] = 2*a[u] - sum; if (a[u] > sum || a[u] < mx || f[u] < 0) puts("NO"), exit(0); }
signedmain(){ n = rd(); for (int i=1; i<=n; i++) a[i] = rd(); if (n == 2) return0 * puts(a[1] == a[2] ? "YES" : "NO"); for (int i=1; i<n; i++) { int u = rd(), v = rd(); G[u].push_back(v), G[v].push_back(u); d[u]++, d[v]++; }
int rt; for (int i=1; i<=n; i++) if (d[i] > 1) { rt = i; break; } dfs(rt, 0);
puts(f[rt] ? "NO" : "YES"); }
AGC011D
有点水,推一推或者直接打表都可以发现每次要么第一个数取反要么整体左移并取反, 以至于很快尾部出现 BABA 型循环节,最后把所有数字顶掉,形成 1~2 周期的循环, 于是 bitset 暴力模拟一下即可。