Codeforces Round #530 (Div. 1)
阿新 • • 發佈:2019-01-06
== getchar() git fir ORC printf oid for etc
A - Sum in the tree
就是貪心選盡量讓上面的點權盡量大,那麽對於偶數層的點,其到根節點的和即為所有兒子中的最大值。
#include<bits/stdc++.h> using namespace std; char gc() { // static char buf[100000],*p1,*p2; // return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin))?EOF:*p1++; return getchar(); } template<class T> int read(T &ans) { T f=1;ans=0; char ch=gc(); while(!isdigit(ch)) { if(ch==EOF) return EOF; if(ch=='-') f=-1; ch=gc(); } while(isdigit(ch)) ans=ans*10+ch-'0',ch=gc(); ans*=f;return 1; } template<class T1,class T2> int read(T1 &a,T2 &b) { return read(a)==EOF?EOF:read(b); } template<class T1,class T2,class T3> int read(T1 &a,T2 &b,T3 &c) { return read(a,b)==EOF?EOF:read(c); } typedef long long ll; const int Maxn=1100000; const int inf=0x3f3f3f3f; const ll mod=1000000007; int s[Maxn],to[Maxn],nxt[Maxn],first[Maxn],tot=1; int n,x,flag; ll ans; inline void add(int u,int v) { to[tot]=v; nxt[tot]=first[u]; first[u]=tot++; } void dfs(int root) { if(s[root]==-1) { int temp=inf; for(int i=first[root];i;i=nxt[i]) { dfs(to[i]); temp=min(temp,s[to[i]]); } s[root]=temp; for(int i=first[root];i;i=nxt[i]) { ans+=s[to[i]]-s[root]; } } else { for(int i=first[root];i;i=nxt[i]) { dfs(to[i]); if(s[to[i]]==inf) s[to[i]]=s[root]; if(s[to[i]]<s[root]) flag=1; ans+=s[to[i]]-s[root]; } } } int main() { read(n); for(int i=2;i<=n;i++) { read(x); add(x,i); } for(int i=1;i<=n;i++) read(s[i]); dfs(1);ans+=s[1]; if(flag) return 0*puts("-1"); printf("%I64d",ans); return 0; }
Codeforces Round #530 (Div. 1)