Cod sursa(job #198317)

Utilizator maria_dcontu meu maria_d Data 10 iulie 2008 13:15:11
Problema Dosare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
   #include <cstdio>  
   #include <vector>  
   #include <algorithm>  
   #define IN "dosare.in"  
   #define OUT "dosare.out"  
   #define FOR(i,a,b) for(int i=a;i<b;++i)  
   #define N_MAX 16001  
   #define pb push_back  
   #define ll long long   
   #define sz size()    
     
   using namespace std;  
   vector < vector<ll> > a(N_MAX);   
   ll acces[N_MAX];  
   ll total[N_MAX];  
   ll N;  
   ll sol;  
     
   void scan()  
   {  
       ll x;  
       freopen(IN, "r",stdin);  
       freopen(OUT, "w",stdout);  
       scanf("%lld", &N);  
       FOR(i,1,N)  
       {  
           scanf("%lld", &x);  
           a[--x].pb(i);  
       }     
       FOR(i,0,N)  
           scanf("%lld", &acces[i]);  
   }         
     
   void DF(ll nod,ll cost)  
   {  
       ll l = a[nod].sz;  
       FOR(j,0,l)  
           DF(a[nod][j],cost+1);  
         
       FOR(j,0,l)    
           total[j] = acces[ a[nod][j] ];    
     
       sort(total , total + l );    
       reverse(total , total + l );      
         
       FOR(j,0,l)    
           sol += j* total[j],  
           acces[nod] += total[j];    
         
       sol += acces[nod];    
         
   }  
     
   void solve()  
   {  
       DF(0,1);  
       printf("%lld ",sol);  
   }  
     
   int main()  
   {  
       scan();  
       solve();  
       return 0;  
   }