Pagini recente » Cod sursa (job #1015155) | Cod sursa (job #1438200) | Cod sursa (job #417207) | Cod sursa (job #2390530) | Cod sursa (job #198207)
Cod sursa(job #198207)
# include <stdio.h>
# include <vector>
using namespace std;
# define FIN "dosare.in"
# define FOUT "dosare.out"
# define MAXN 16010
# define ll long long
ll N,i,len,x,s;
ll A[MAXN];
ll P[MAXN];
ll T[MAXN];
ll Niv[MAXN];
vector <ll> dosare[MAXN];
ll part(ll poz,ll st,ll dr)
{
ll i,j,s,aux;
i = st;
j = dr;
s = -1;
while (i < j)
{
if (A[dosare[poz][i]]<A[dosare[poz][j]])
{
aux = dosare[poz][i];
dosare[poz][i] = dosare[poz][j];
dosare[poz][j] = aux;
s = -s;
}
if (s == 1) i++;
else j--;
}
return i;
}
void qsort(ll poz,ll st,ll dr)
{
ll p;
if (st<dr)
{
p = part(poz,st,dr);
qsort(poz,st,p-1);
qsort(poz,p+1,dr);
}
}
int main()
{
freopen(FIN,"r",stdin);
freopen(FOUT,"w",stdout);
scanf("%lld",&N);
for (i = 2; i <= N; ++i)
{
scanf("%lld",&x);
dosare[x].push_back(i);
}
for (i = 1; i <= N; ++i)
scanf("%lld",&A[i]), P[i] = A[i];
ll j;
for (i = N; i >= 1; i--)
if (dosare[i].size() > 0)
{
len = dosare[i].size() - 1;
qsort(i,0,len);
for (j = 0; j <= len; ++j)
{
T[dosare[i][j]] = j + 1;
A[i] += A[dosare[i][j]];
}
}
Niv[1] = 1;
for (i = 1; i <= N; ++i)
if (dosare[i].size() > 0)
{
len = dosare[i].size() - 1;
for (j = 0; j <= len; ++j)
Niv[dosare[i][j]] = Niv[i] + T[dosare[i][j]];
}
s = 0;
for (i = 1; i <= N; ++i)
s += P[i] * Niv[i];
printf("%lld",s);
return 0;
}