Cod sursa(job #2111694)

Utilizator robx12lnLinca Robert robx12ln Data 22 ianuarie 2018 16:33:52
Problema Dosare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream fin("dosare.in");
ofstream fout("dosare.out");
long long A[16005], D[16005];
int N;
vector<int> v[16005];
inline int cmp( int a, int b ){
    return A[a] > A[b];
}
void dfs( int nod ){
    for( int i = 0; i < v[nod].size(); i++ ){
        int vecin = v[nod][i];
        dfs( vecin );
        A[nod] += A[vecin];
    }
    D[nod] = A[nod];
    if( !v[nod].empty() ){
        sort( v[nod].begin(), v[nod].end(), cmp );
        for( int i = 0; i < v[nod].size(); i++ ){
            int vecin = v[nod][i];;
            D[nod] += i * A[vecin] + D[vecin];
        }
    }
    return;
}
int main(){
    fin >> N;
    for( int i = 2; i <= N; i++ ){
        int x; fin >> x;
        v[x].push_back( i );
    }
    for( int i = 1; i <= N; i++ )
        fin >> A[i];
    dfs( 1 );
    fout << D[1] << "\n";
    return 0;
}