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;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步