zoukankan      html  css  js  c++  java
  • Codeforces Round #530 Sum in the tree[贪心]

    /*
    对于每一个u和他的儿子v
    
    必定存在 $s[u]leq min{s[v]}$ ,否则不合法(因为a_igeq 0)
    
    这样u和他所有儿子的点权和是 
    $$
    sleft[ u 
    ight] +sum_{vin sonleft( u 
    ight)}{sleft[ v 
    ight] -sleft[ u 
    ight]}
    \
    =left( 1-cntleft( u 
    ight) 
    ight) *sleft[ u 
    ight] -sum_{vin sonleft( u 
    ight)}{s}left[ v 
    ight] 
    \
    k=left( 1-cntleft( u 
    ight) 
    ight) le 0
    $$
    所以x(也就是s[u])越大,这个值越小,最大的合法的x就是min{s[v]}
     
    所以我们把未知的s[i]设成inf,把父亲的s设成儿子的s中最小的那个,同时判断是否无解并统计答案,这个题就做完了
    */
    #include <bits/stdc++.h>
    using namespace std;
    int64_t n,p[100005],s[100005],i,A;
    #define R(a) for(i=a;i<=n;++i)
    int main(){
     cin>>n;
     R(2)cin>>p[i];
     R(1)cin>>s[i];
     R(2)(~s[i])?s[p[i]]=min(s[i],s[p[i]]):s[i]=1e9+1;//保证1<=p[i]<i 这里相当于从上往下分层更新
     R(1)if(s[i]<s[p[i]])return puts("-1"),0;else A+=s[i]>1e9?0:s[i]-s[p[i]];//>1e9的是深度为偶数的叶子
     cout<<A;
    }
    
  • 相关阅读:
    哇~~
    震作震作~~life is only Soso
    真j8无聊
    川行之旅
    可爱的java,我又来看你了,
    暑假周进度总结报告2
    暑假周进度总结报告1
    暑假周进度总结报告3
    2017级软工经验交流体验
    暑假周进度总结报告4
  • 原文地址:https://www.cnblogs.com/storz/p/10230102.html
Copyright © 2011-2022 走看看