Cod sursa(job #1771820)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 6 octombrie 2016 00:45:18
Problema Dosare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define nmax 16005
using namespace std;
long long ans,d[nmax];
int n,k[nmax];
vector <int> v[nmax];


void dfs(int nod)
{
    int i,j;
    d[nod]=k[nod];
    for (i=0;i<v[nod].size();i++) {
        j=v[nod][i];
        dfs(j);
        d[nod]+=d[j];
    }
    for (i=0;i<v[nod].size();i++)
        v[nod][i]=d[v[nod][i]];

    ans+=d[nod];
    sort(v[nod].begin(),v[nod].end());
    reverse(v[nod].begin(),v[nod].end());
    for (i=0;i<v[nod].size();i++)
        ans+=i*1LL*v[nod][i];

}
int main()
{
    int i,j;
    freopen("dosare.in","r",stdin);
    freopen("dosare.out","w",stdout);
    scanf("%d",&n);
    for (i=2;i<=n;i++) {
        scanf("%d",&j);
        v[j].push_back(i);
    }
    for (i=1;i<=n;i++)
        scanf("%d",&k[i]);
    dfs(1);
    printf("%lld",ans);

    return 0;
}