Cod sursa(job #128876)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 28 ianuarie 2008 00:35:34
Problema Dosare Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.67 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

#define nmax 16111
#define FOR(i,s,d) for(i=(s);i<(d);++i)
#define sz size()
#define pb push_back

int n,A[nmax],sol,aux[nmax];
vector <int> G[nmax];

void doit(int i,int z)
{
	int j;
	FOR(j,0,G[i].sz)
		doit(G[i][j],z+1);
	FOR(j,0,G[i].sz)
		aux[j]=A[G[i][j]];
	sort(aux,aux+G[i].sz);
	reverse(aux,aux+G[i].sz);
	FOR(j,0,G[i].sz)
		sol+=j*aux[j],A[i]+=aux[j];
	sol+=A[i];
}

int main()
{
	freopen("dosare.in","r",stdin);
	freopen("dosare.out","w",stdout);
	scanf("%d",&n);
	int i,j;
	FOR(i,1,n)
		scanf("%d",&j), G[--j].pb(i);
	FOR(i,0,n)
		scanf("%d",&A[i]);
	doit(0,1);
	printf("%d\n",sol);
	return 0;
}