Cod sursa(job #128877)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 28 ianuarie 2008 00:36:49
Problema Dosare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.71 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

typedef long long lint;

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

void doit(lint i,lint z)
{
	lint 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);
	lint i,j;
	FOR(i,1,n)
		scanf("%lld",&j), G[--j].pb(i);
	FOR(i,0,n)
		scanf("%lld",&A[i]);
	doit(0,1);
	printf("%lld\n",sol);
	return 0;
}