1. 程式人生 > >Codeforces Round #530 (Div. 1)

Codeforces Round #530 (Div. 1)

== 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)