Cod sursa(job #3313805)

Utilizator iustinola16Olariu Iustin iustinola16 Data 6 octombrie 2025 19:36:26
Problema Dosare Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <bits/stdc++.h>

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

const int NMAX = 16005;

struct Nod {
    vector <int> copii;
    int dp;
}v[NMAX];

int n, ans = 0;
int accesari[NMAX];

void dfs(int node, int depth) {
    for (auto it : v[node].copii) {
        dfs(it, depth + 1);
        v[node].dp += v[it].dp;
    }

    v[node].dp += accesari[node];

    ans += accesari[node] * depth;

    sort(v[node].copii.begin(), v[node].copii.end(), [](int a, int b) {
        return v[a].dp > v[b].dp;
    });

    for (int i = 0; i < v[node].copii.size(); i++) {
        int x = v[node].copii[i];

        ans += v[x].dp * i;
    }
}
int main()
{
    fin >> n;

    for (int i = 2; i <= n; i++) {
        int parinte;
        fin >> parinte;
        v[parinte].copii.push_back(i);
    }

    for (int i = 1; i <= n; i++) {
        fin >> accesari[i];
    }

    dfs(1, 1);

    fout << ans;
    return 0;
}