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
}
posted @ 2022-11-01 15:56  ycllz  阅读(18)  评论(0)    收藏  举报