Pagini recente » Cod sursa (job #2436704) | Cod sursa (job #1942751) | Cod sursa (job #3225326) | Cod sursa (job #1526785) | Cod sursa (job #2106180)
#include<bits/stdc++.h>
#define maxN 100005
using namespace std;
long long w[maxN];
long long dp[maxN],n,x;
vector<int> v[maxN];
inline bool cmp(long long a,long long b)
{
return w[a]>w[b];
}
long long cost[maxN];
inline void dfs(int nod)
{
dp[nod]=0;
w[nod]=cost[nod];
for(auto it:v[nod])
{
dfs(it);
w[nod]+=w[it];
}
if(!v[nod].empty())
{
sort(v[nod].begin(),v[nod].end(),cmp);
for(long long i=0;i<(int)v[nod].size();i++)
{
dp[nod]=dp[nod]+i*w[v[nod][i]]+dp[v[nod][i]];
}
}
dp[nod]+=w[nod];
}
int main()
{
freopen("dosare.in","r",stdin);
freopen("dosare.out","w",stdout);
scanf("%lld",&n);
for(int i=2;i<=n;i++)
{
scanf("%lld",&x);
v[x].push_back(i);
}
for(int i=1;i<=n;i++)
scanf("%lld",&cost[i]);
dfs(1);
printf("%lld\n",dp[1]);
return 0;
}