Cod sursa(job #778399)

Utilizator danalex97Dan H Alexandru danalex97 Data 14 august 2012 17:09:50
Problema Dosare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

#define Size(c) \
	int((c).size())
#define sortare(c) \
	(c).rbegin(), (c).rend()
#define Parc(it, c) \
	for (typeof((c).begin()) it = (c).begin(); it != (c).end(); ++it)

const int Nmax = 16005;

int N; long long Press[Nmax],Ret;
vector<int> Leg[Nmax];

void Get (int k) 
{
	vector<long long> T;
	Parc ( it, Leg[k] ) 
		Get (*it),
		Press[k] += Press[*it],
		T.push_back(Press[*it]);
	sort( sortare(T) );
	for (int i = 0; i < Size(T); ++i)
		Ret += T[i]*(i+1);
}

int main() 
{
	freopen("dosare.in", "r", stdin);
	freopen("dosare.out", "w", stdout);

	scanf("%d", &N);
	for (int i = 2; i <= N; ++i) 
	{
		int father;
		scanf("%d", &father);
		Leg[father].push_back(i);
	}
	for (int i = 1; i <= N; ++i)
		scanf("%lld", Press+i);
	
	Get (1);
	
	printf("%lld\n", Ret + Press[1]);
}