Pagini recente » Cod sursa (job #2929507) | Cod sursa (job #1832910) | Cod sursa (job #2943972) | Cod sursa (job #2307190) | Cod sursa (job #308336)
Cod sursa(job #308336)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define file_in "dosare.in"
#define file_out "dosare.out"
#define sz size
#define pb push_back
#define Nmax 16100
vector<int> v[Nmax];
int a[Nmax];
int b[Nmax];
int n;
int aa[Nmax];
int sum=0;
inline int cmp(int a,int b)
{
return aa[a]>aa[b];
}
void dfs1(int nod)
{
int i;
for (i=0;i<v[nod].sz();++i)
{
dfs1(v[nod][i]);
//a[nod]+=a[v[nod][i]];
}
for (i=0;i<v[nod].sz();++i)
{
aa[i]=a[v[nod][i]];
}
sort(aa,aa+1,cmp);
for (i=v[nod].sz()-1;i>=0;--i)
{
sum+=i*aa[v[nod].sz()-i-1];
a[nod]+=aa[i];
}
sum+=a[nod];
}
void dfs2(int nod1, int nod2)
{
int i;
a[nod1]=nod2;
for (i=0;i<v[nod1].sz();++i)
{
dfs2(v[nod1][i],nod2+i);
}
}
void citire()
{
int i,x,y;
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
scanf("%d", &n);
for (i=2;i<=n;++i)
{
scanf("%d", &x);
v[x].pb(i);
}
for (i=1;i<=n;++i)
{
scanf("%d", &y);
a[i]=y;
b[i]=y;
}
}
void solve()
{
int i;
dfs1(1);
/*for (i=1;i<=n;++i)
sort(v[i].begin(),v[i].end(),cmp); */
//dfs2(1,1);
}
void scrie()
{
int i;
/*for (i=1;i<=n;++i)
// printf("%d ",a[i]);
sum+=b[i]*a[i]; */
printf("%d", sum);
}
int main()
{
citire();
solve();
scrie();
fclose(stdin);
fclose(stdout);
return 0;
}