Pagini recente » Cod sursa (job #2584495) | Cod sursa (job #371170) | Cod sursa (job #1184153) | Cod sursa (job #471488) | Cod sursa (job #3240552)
#include <bits/stdc++.h>
#define VMAX 100
#define NMAX 16000
#define LOG 21
#define INF (int)(10e8)
#define MOD 4001
#define ll long long int
#define NIL 0
using namespace std;
ifstream fin("dosare.in");
ofstream fout("dosare.out");
int n;
vector<int> adj[NMAX+1];
ll dp[NMAX+1],a[NMAX+1];
ll res=0;
bool cmp(int x,int y)
{
return dp[x] > dp[y];
}
void dfs(int x)
{
dp[x]=a[x];
for(int i : adj[x])
{
dfs(i);
dp[x] += dp[i];
}
sort(adj[x].begin(),adj[x].end(),cmp);
int k=1;
res += a[x];
for(int i : adj[x])
{
res = res + k * 1ll * dp[i];
++k;
}
}
int main()
{
cin >> n;
for(int i=2;i<=n;i++)
{
int p;
cin >> p;
adj[p].push_back(i);
}
for(int i=1;i<=n;i++)
{
cin >> a[i];
}
dfs(1);
cout << res;
}