Codeforces Round #530 (Div. 1)

Posted shanxieng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #530 (Div. 1)相关的知识,希望对你有一定的参考价值。

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)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #530 (Div. 1)

Codeforces Round 530 大下分记

Codeforces Round #530 (Div. 2)

Codeforces Round #530 (Div. 2) (前三题题解)

Codeforces Round #530 (Div. 2)F Cookies (树形dp+线段树)

Codeforces 1099 D. Sum in the tree-构造最小点权和有根树 贪心+DFS(Codeforces Round #530 (Div. 2))