Pagini recente » Cod sursa (job #815546) | Cod sursa (job #1743923) | Cod sursa (job #2117321) | Cod sursa (job #2095354) | Cod sursa (job #263472)
Cod sursa(job #263472)
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
FILE*fin=fopen("dosare.in","r");
FILE*fout=fopen("dosare.out","w");
#define nm 16005
#define pb push_back
#define ll long long
int n,a[nm];
ll acc[nm],ans[nm];
vector<int> arb[nm];
inline int cmp(int a,int b){return acc[a]>acc[b];}
void findacc(int nod)
{
int nnod,i;
for(i=0;i<arb[nod].size();i++) findacc(arb[nod][i]);
sort(arb[nod].begin(),arb[nod].end(),cmp);
acc[nod]=a[nod];
ans[nod]=a[nod];
for(i=0;i<arb[nod].size();i++)
{
nnod=arb[nod][i];
acc[nod]+=acc[nnod];
ans[nod]+=acc[nnod]*(i+1)+ans[nnod];
}
}
int main()
{
int i,x;
fscanf(fin,"%d",&n);
for(i=1;i<n;i++)
{
fscanf(fin,"%d",&x);
arb[x].pb(i+1);
}
for(i=1;i<=n;i++)
fscanf(fin,"%d",&a[i]);
findacc(1);
fprintf(fout,"%lld",ans[1]);
fclose(fin);
fclose(fout);
return 0;
}