Codeforces Round #530 Sum in the tree[贪心]

/*
对于每一个u和他的儿子v

必定存在 $s[u]\leq min{s[v]}$ ,否则不合法(因为a_i\geq 0)

这样u和他所有儿子的点权和是 
$$
s\left[ u \right] +\sum_{v\in son\left( u \right)}{s\left[ v \right] -s\left[ u \right]}
\\
=\left( 1-cnt\left( u \right) \right) *s\left[ u \right] -\sum_{v\in son\left( u \right)}{s}\left[ v \right] 
\\
k=\left( 1-cnt\left( u \right) \right) \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;
}
posted @ 2019-01-06 20:02  QvvQ  阅读(283)  评论(0编辑  收藏  举报