Cod sursa(job #2089004)

Utilizator aeromaniaXRadoi Iulian aeromaniaX Data 16 decembrie 2017 10:09:33
Problema Dosare Scor 70
Compilator cpp Status done
Runda info_test_2 Marime 1.14 kb
#include <bits/stdc++.h>
using namespace std;

int n,m,cost[16006],ap[16006],x,y,i,rez;

vector <int> G[16006];

int a[16005];

bool cmp(int x,int y)
{
    return a[x]>a[y];
}

int doit(int n)
{
    if(G[n].size()==0)
    {
        return a[n];
    }
    else
    {
        int s=a[n];

        for(int i=0;i<G[n].size();i++)
            s=s+doit(G[n][i]);
        a[n]=s;
        return s;
    }

}

void doCost(int n)
{
    for(int i=0;i<G[n].size();i++)
    {
        cost[G[n][i]]=cost[n]+i+1;
        doCost(G[n][i]);
    }
}


int main()
{
    freopen("dosare.in","r",stdin);
    freopen("dosare.out","w",stdout);
      scanf("%d",&n);
      for(int i=2;i<=n;i++)
      {
           scanf("%d",&x);
           G[x].push_back(i);
      }

      for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        ap[i]=a[i];
      }

      doit(1);

      for(int i=1;i<=n;i++)
          if(G[i].size()!=0)
              sort(G[i].begin(),G[i].end(),cmp);

      cost[1]=1;
      doCost(1);

      for(int i=1;i<=n;i++)
            rez+=ap[i]*cost[i];
      printf("%d\n",rez);

      return 0;

}