Cod sursa(job #2030075)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 1 octombrie 2017 01:14:46
Problema Dosare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define DIM 16002

using namespace std;

ifstream f("dosare.in");
ofstream g("dosare.out");

int n, cost[DIM], t[DIM], cost2[DIM];

vector <int> arb[DIM];

void Cost(int nod)
{
    for(int i = 0; i < arb[nod].size(); ++ i)
    {
        Cost(arb[nod][i]);
    }
    if(nod != 1)
    {
        cost[t[nod]] += cost[nod];
    }
}

int sol(int nod, int nr)
{
    for(int i = 0; i < arb[nod].size(); ++ i)
    {
        int vall = i;
        if(nod == 1)
            ++ vall;
        sol(arb[nod][i], vall + 1);
    }
    if(nod != 1)
    {
        int val = cost2[nod] * nr;
        //if(cost[nod] > 1) val *= (cost[nod] - 1);
        cost2[t[nod]] += val;
    }
}

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

int main()
{
    f>>n;
    for(int i = 2; i <= n; ++ i)
        f>>t[i];

    for(int i = 1; i <= n; ++ i)
    {
        f>>cost[i];
        cost2[i] = cost[i];
    }

    for(int i = 1; i <= n; ++ i)
    {
        arb[t[i]].push_back(i);
    }

    Cost(1);

    for(int i = 1; i <= n; ++ i)
        sort(arb[i].begin(), arb[i].end(), cmd);

    /*for(int i = 1; i <= n; ++ i)
    {
        for(int j = 0; j < arb[i].size(); ++ j)
            g<<arb[i][j]<<" ";
        g<<'\n';
    }*/

    sol(1, 1);

    g<<cost2[1];


    return 0;
}