Pagini recente » Cod sursa (job #802402) | Cod sursa (job #2626904) | Cod sursa (job #514505) | Cod sursa (job #2626338) | Cod sursa (job #308338)
Cod sursa(job #308338)
#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
#define ll long long
vector<long> v[Nmax];
ll a[Nmax];
ll b[Nmax];
long n;
ll aa[Nmax];
ll sum=0;
inline int cmp(int a,int b)
{
return aa[a]>aa[b];
}
void dfs1(long nod)
{
long 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);
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("%ld", &n);
for (i=2;i<=n;++i)
{
scanf("%ld", &x);
v[x].pb(i);
}
for (i=1;i<=n;++i)
{
scanf("%ld", &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()
{
/*for (i=1;i<=n;++i)
// printf("%d ",a[i]);
sum+=b[i]*a[i]; */
printf("%lld", sum);
}
int main()
{
citire();
solve();
scrie();
fclose(stdin);
fclose(stdout);
return 0;
}