Cod sursa(job #3269798)

Utilizator Mihai_OctMihai Octavian Mihai_Oct Data 20 ianuarie 2025 20:09:04
Problema Dosare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.8 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("dosare.in");
ofstream fout("dosare.out");
long long n, i, fr[16002];
vector<int> g[16002];

static inline bool Cmp(int a, int b) {
    return fr[a] > fr[b];
}

static inline long long Dfs(int nod = 1, int ult = 0) {
    long long sum = 0;
    for(int urm : g[nod]) {
        if(urm != ult) sum += Dfs(urm, nod);
    }

    sort(g[nod].begin(), g[nod].end(), Cmp);

    for(int i = 0; i < g[nod].size(); i++) {
        fr[nod] += fr[g[nod][i]];
        sum += (i + 1) * fr[g[nod][i]];
    }
    return sum;
}

int main() {
    fin >> n;
    for(i = 2; i <= n; i++) {
        int t;
        fin >> t;
        g[t].push_back(i);
    }
    for(i = 1; i <= n; i++) fin >> fr[i];

    fout << Dfs() + fr[1];

    return 0;
}