Cod sursa(job #120051)

Utilizator cupacatenumaratecupacatenumarate cupacatenumarate Data 4 ianuarie 2008 00:45:10
Problema Dosare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>
#include <vector>
#include <algorithm>

#define NMAX (1<<14)

using namespace std;

vector<int> A[NMAX];
vector<pair<int,int> > P;
int N, Ac[NMAX], F[NMAX];
long long No[NMAX];

void read()
{
        int i, j;

        freopen("dosare.in", "r", stdin);
        scanf("%d", &N);

        for (i = 2; i <= N; i++)
        {
                scanf("%d", &j);
                A[i].push_back(j);
                A[j].push_back(i);
        }

        for (i = 1; i <= N; i++) scanf("%d", Ac+i);
}

void solve(int i)
{
        int j, n = A[i].size();

        F[i] = 1;

        if (n==1)
        {
                No[i] = Ac[i];
                return;
        }
        
        for (j = 0; j < n; j++)
            if (!F[ A[i][j] ]) solve(A[i][j]);

        No[i] = 0; P.clear();
        for (j = 0; j < n; j++) P.push_back(make_pair(No[A[i][j]], A[i][j]));

        for (j = 0; j < n; j++) No[i] = No[i]+(n-j)*No[A[i][j]];
        No[i] = (No[i]+n)*Ac[i];
}

void write()
{
        freopen("dosare.out", "w", stdout);
        printf("%d\n", No[1]-1);
}

int main()
{
        read();
        solve(1);
        write();
}