Codeforces Round #530 (Div. 2)
阿新 • • 發佈:2019-01-07
RANK :2252 題數 :3
補題:
思路:貪心 把權值放在祖先節點上 ,預處理 每個節點儲存 他與他兒子中 權值最小值即可。
最後會有一些葉子節點依舊為 INF 權值按0算即可,然後其他的權值計算為 它 - 它父親的。
注意判斷時候會出現父親比兒子大的這種非法情況。
#include<bits/stdc++.h> using namespace std; #define inf 0x7f7f7f7f #define ll long long #define maxn 123456 ll fa[maxn],n,s[maxn],ans; int main() { scanf("%lld",&n); for(int i=2; i<=n; i++) scanf("%lld",&fa[i]); for(int i=1; i<=n; i++) { scanf("%lld",&s[i]); if(s[i]==-1)s[i]=inf; } ans=s[1]; for(int i=2; i<=n; i++) s[fa[i]]=min(s[fa[i]],s[i]); for(int i=2; i<=n; i++) { if(s[i]==inf)s[i]=0; else { ans+=s[i]-s[fa[i]]; if(s[i]-s[fa[i]]<0) { printf("-1\n"); return 0; } } } printf("%lld\n",ans); return 0; }