Pagini recente » Cod sursa (job #550939) | Cod sursa (job #2509762) | Cod sursa (job #3192827) | Cod sursa (job #2126012) | Cod sursa (job #198167)
Cod sursa(job #198167)
#include <cstdio>
#include <vector>
#include <algorithm>
#define IN "dosare.in"
#define OUT "dosare.out"
#define FOR(i,a,b) for(int i=a;i<b;++i)
#define N_MAX 16001
#define pb push_back
#define ll long long
#define sz size()
using namespace std;
vector < vector<int> > a(N_MAX);
int acces[N_MAX];
int total[N_MAX];
int N;
ll sol;
void scan()
{
int x;
freopen(IN, "r",stdin);
freopen(OUT, "w",stdout);
scanf("%d", &N);
FOR(i,1,N)
{
scanf("%d", &x);
a[--x].pb(i);
}
FOR(i,0,N)
scanf("%d", &acces[i]);
}
void DF(int nod,int cost)
{
int l = a[nod].sz;
FOR(j,0,l)
DF(a[nod][j],cost+1);
FOR(j,0,l)
total[j] = (ll)acces[ a[nod][j] ];
sort(total , total + l );
reverse(total , total + l );
FOR(j,0,l)
sol += (ll)j* total[j],
acces[nod] += (ll)total[j];
sol += (ll)acces[nod];
}
void solve()
{
DF(0,1);
printf("%lld ",sol);
}
int main()
{
scan();
solve();
return 0;
}