Pagini recente » Cod sursa (job #2962186) | Cod sursa (job #2914027) | Cod sursa (job #1194115) | Cod sursa (job #2658363) | Cod sursa (job #198179)
Cod sursa(job #198179)
# 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];
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]);
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)
A[i] += A[dosare[i][j]] + j + 1;
}
for (i = 1; i <= N; i++)
if (dosare[i].size() != 0)
{
len = dosare[i].size() - 1;
for (j = 0; j <= len; ++j)
A[i] -= A[dosare[i][j]] + j + 1;
}
P[1] = 1;
s = A[1];
for (i = 1; i <= N; ++i)
if (dosare[i].size() != 0)
{
len = dosare[i].size() - 1;
for (j = 0; j <= len; ++j)
{
P[dosare[i][j]] = P[i] + j + 1;
s += P[dosare[i][j]]*A[dosare[i][j]];
}
}
printf("%lld",s);
return 0;
}