Pagini recente » Cod sursa (job #122958) | Cod sursa (job #3207560) | Cod sursa (job #1950966) | Cod sursa (job #2174848) | Cod sursa (job #117871)
Cod sursa(job #117871)
#include <stdio.h>
#include <functional>
#include <algorithm>
#include <vector>
using namespace std;
#define MAX_N 16005
#define FIN "dosare.in"
#define FOUT "dosare.out"
#define pb push_back
#define ll long long
int N, A[MAX_N], V[MAX_N], nv;
vector<short> G[MAX_N];
ll DFS(int n)
{
ll ret = A[n];
vector<short>::iterator it;
for (it = G[n].begin(); it != G[n].end(); ++it)
{
ret += DFS(*it);
A[n] += A[*it];
}
nv = 0;
for (it = G[n].begin(); it != G[n].end(); ++it)
V[nv++] = A[*it];
sort(V, V+nv, greater<int>());
for (int i = 0; i < nv; ++i)
ret += (ll)(i+1)*V[i];
return ret;
}
int main(void)
{
int i, up;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d", &N);
for (i = 1; i < N; ++i)
{
scanf("%d", &up);
G[--up].pb(i);
}
for (i = 0; i < N; ++i)
scanf("%d", A+i);
printf("%lld\n", DFS(0));
return 0;
}