Pagini recente » Cod sursa (job #1765766) | Cod sursa (job #1641143) | Cod sursa (job #538848) | Cod sursa (job #2862258) | Cod sursa (job #221510)
Cod sursa(job #221510)
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
#define NMAX 16024
vector< int >Q[NMAX];
long long T[NMAX],S[NMAX];
void DFT(const int nod)
{
vector< int >::iterator it;
T[nod]=S[nod];
for(it=Q[nod].begin(); it!=Q[nod].end(); ++it)
{
DFT(*it);
T[nod]+=T[*it];
}
}
inline int cmp(const int p1,const int p2)
{
return T[ p1 ]>T[ p2 ];
}
long long solve(const int nod)
{
vector< int >::iterator it;
long long ANS=0;
for(it=Q[nod].begin(); it!=Q[nod].end(); ++it)
ANS+=solve( *it );
sort( Q[nod].begin(), Q[nod].end(), cmp );
int prec=1;
for(it=Q[nod].begin(); it!=Q[nod].end(); ++it)
{
ANS+=T[*it]*prec++;
}
return ANS;
}
int main()
{
freopen("dosare.in","r",stdin);
freopen("dosare.out","w",stdout);
int N;
scanf("%d",&N);
int i,a1;
for(i=1; i<N; ++i)
{
scanf("%d",&a1);
Q[a1].push_back(i+1);
}
long long ST=0;
for(i=1; i<=N; ++i){
scanf("%lld",&S[i]);
ST+=S[i];
}
DFT( 1 );
printf("%lld\n",solve(1)+ST);
return 0;
}