Cod sursa(job #2089063)

Utilizator giotoPopescu Ioan gioto Data 16 decembrie 2017 10:41:06
Problema Dosare Scor 100
Compilator cpp Status done
Runda info_test_2 Marime 0.92 kb
#include <bits/stdc++.h>
using namespace std;

int n;
int TT[16006], l[16006];
long long a[16006];
vector <int> v[16006];
inline void dfs(int nod){
    for(auto it : v[nod]){
        dfs(it);
        a[nod] += a[it];
    }
}
inline bool cmp(int x, int y){
    return a[x] > a[y];
}
int main(){
    freopen("dosare.in", "r", stdin);
    freopen("dosare.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 2; i <= n ; ++i){
        scanf("%d", &TT[i]);
        v[TT[i]].push_back(i);
    }
    for(int i = 1; i <= n ; ++i)
        scanf("%lld", &a[i]);
    dfs(1);
    long long Sol = a[1];
    for(int i = 1; i <= n ; ++i){
        if(v[i].empty()) continue ;
        int NR = 0;
        for(auto it : v[i]) l[++NR] = it;
        sort(l + 1, l + NR + 1, cmp);
        for(int i = 1; i <= NR ; ++i)
            Sol = Sol + 1LL * (i - 1) * a[l[i]] + a[l[i]];
    }
    printf("%lld", Sol);
    return 0;
}