Codeforces Round #660 (Div. 2) C
C. Uncle Bogdan and Country Happiness
看完样例发现
我们要是通往该点不开心的人数很少是没有什么限制的
只要是合法的 也就是h[i]在[-经过该点的人数,经过该点的人数]的范围内就是可以的
我们主要check的是 通往该点不开心人数较多的时候
我们肯定光靠自己的该节点的人不够 而子节点不开心的人较少的时候 就会产生冲突
我们设res为子节点能容纳的最多的不开心人数 我们只需要check 该点要不开心的人数>该点自己的人数+res
要是不成立我们显然要NO 还有就是要注意我们这里要是h[i]的下界我们是通过这个不等式check了
但是上界没有check到 也就是还要加上h[u]>p[u] NO (就是这里没写 wa了三发
注意还有就是 要是除不尽也是NO 第二个样例也写了的
int n,m,p[N],h[N],flag,a[N];
vector<int>g[N];
void dfss(int u,int fa){
for(auto v:g[u]){
if(v==fa)continue;
dfss(v,u);
p[u]+=p[v];
}
}
int dfs(int u,int fa){
int res=0;
for(auto v:g[u]){
if(v==fa)continue;
res+=dfs(v,u);
}
if(flag)return 0;
if((p[u]-h[u])/2>a[u]+res||(p[u]-h[u])%2||h[u]>p[u]){
flag=1;
}
return (p[u]-h[u])/2;
}
void solve(){
cin>>n>>m;
for(int i=1;i<=n;i++)g[i].clear();
flag=0;
for(int i=1;i<=n;i++)cin>>p[i],a[i]=p[i];
for(int i=1;i<=n;i++)cin>>h[i];
for(int i=1;i<n;i++){
int u,v;cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
dfss(1,0);
dfs(1,0);
if(flag)NO else YES
}