Cod sursa(job #2485461)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 1 noiembrie 2019 16:56:27
Problema Dosare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <bits/stdc++.h>
#define DIM 16005

using namespace std;

ifstream fin  ("dosare.in");
ofstream fout ("dosare.out");

int n, i, a, x, nr;
int viz[DIM];

long long d[DIM], cost[DIM];
//d[i] = nr total de apasari de taste daca i este radacina

vector <int> L[DIM];

int cmp(int a, int b) {
    return cost[a] > cost[b];
}

void dfs (int nod){
    int vecin, i;
    viz[nod] = 1;
    for (i=0; i<L[nod].size(); i++){
        vecin = L[nod][i];
        if (viz[vecin] == 0)
            dfs(vecin);
        cost[nod] += cost[vecin];
    }
    d[nod] = cost[nod];
    sort (L[nod].begin(), L[nod].end(), cmp);
    for (i=0; i<L[nod].size(); i++){
        vecin = L[nod][i];
        d[nod] += i*cost[vecin] + d[vecin];
    }
}

int main(){
    fin >> n;
    for (i=2; i<=n; i++){
        fin >> a;
        L[a].push_back(i);
    }
    for (i=1; i<=n; i++){
        fin >> cost[i];
    }
    dfs(1);
    fout << d[1];
    return 0;
}