Cod sursa(job #308319)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 26 aprilie 2009 19:27:44
Problema Dosare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <stdlib.h>

using namespace std;

#define file_in "dosare.in"
#define file_out "dosare.out"

#define sz size
#define pb push_back

#define Nmax 16100

int *v[Nmax];
int a[Nmax];
int b[Nmax];
int n;

inline int cmp(int a,int b)
{
	return v[a]>v[b];
}   

void dfs1(int nod)
{
	int i;
	for (i=1;i<=v[nod][0];++i)
	{
		dfs1(v[nod][i]);
		a[nod]+=a[v[nod][i]];
	}
}
	
void dfs2(int nod1, int nod2)
{
	int i;
	a[nod1]=nod2;
	for (i=1;i<=v[nod1][0];++i)
	{
		dfs2(v[nod1][i],nod2+i);
	}
}


		
void citire()
{
	int i,x,y;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d", &n);
	
	for (i=1;i<=n;++i)
	{
		v[i]=(int *) realloc(v[i],sizeof(int));
		v[i][0]=0;
	}
	
	for (i=2;i<=n;++i)
	{
		scanf("%d", &x);
		v[x][0]++;
		v[x]=(int *) realloc(v[x], (v[x][0]+1)*(sizeof(int)));
		v[x][v[x][0]]=i;
	}
	
	for (i=1;i<=n;++i)
	{
		scanf("%d", &y);
		a[i]=y;
		b[i]=y;
	}
}

void solve()
{
	int i;
	
	dfs1(1);
	
	for (i=1;i<=n;++i)
	    sort(v[i]+1,v[i]+v[i][0]+1,cmp);
	
	dfs2(1,1);
}

void scrie()
{
	int i,sum=0;
	for (i=1;i<=n;++i)
		// printf("%d ",a[i]);
		sum+=b[i]*a[i];
	printf("%d", sum);
}

int main()
{
	citire();
	solve();
	scrie();
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}