Cod sursa(job #198316)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 10 iulie 2008 13:06:18
Problema Dosare Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
# include <stdio.h>
# include <vector>
# include <algorithm>

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];   

    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);
          }
        dosare[0].push_back(1);
          
        for (i = 1; i <= N; ++i)
          scanf("%lld",&A[i]);
        
        ll j;  
        s = 0;
        for (i = N; i >= 0; i--)
          if (dosare[i].size() > 0)
            {
                len = dosare[i].size();
                for (j = 0; j < len; ++j)
                  P[j + 1] = A [dosare[i][j]];
                  
                sort(P+1,P+len+1);
                
                for (j = len; j >= 1; j--)
                  {
                      A[i] += P[j];
                      s += (len - j + 1) * P[j]; 
                  }       
            }
                        
        printf("%lld",s);
                  
        return 0;
    }