Cod sursa(job #308317)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 26 aprilie 2009 19:23:45
Problema Dosare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

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

#define sz size
#define pb push_back

#define Nmax 16100

vector<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=0;i<v[nod].sz();++i)
	{
		dfs1(v[nod][i]);
		a[nod]+=a[v[nod][i]];
	}
}
	
void dfs2(int nod1, int nod2)
{
	int i;
	a[nod1]=nod2;
	for (i=0;i<v[nod1].sz();++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=2;i<=n;++i)
	{
		scanf("%d", &x);
		v[x].pb(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].begin(),v[i].end(),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;
}