Cod sursa(job #308339)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 26 aprilie 2009 20:22:22
Problema Dosare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <cstdio>      
#include <vector>      
#include <algorithm>      
     
using namespace std;      
     
#define file_in "dosare.in"      
#define file_out "dosare.out"      
     
#define sz size      
#define pb push_back      
     
#define Nmax 16100      
#define ll long long     
  
vector<long> v[Nmax];      
ll a[Nmax];      
ll b[Nmax];      
long n;      
ll aa[Nmax];   
ll sum=0;   
     
inline int cmp(int a,int b)      
{      
    return aa[a]>aa[b];      
}         
     
void dfs1(long nod)      
{      
    long i;      
    for (i=0;i<v[nod].sz();++i)      
    {      
        dfs1(v[nod][i]);      
        //a[nod]+=a[v[nod][i]];      
    }   
    for (i=0;i<v[nod].sz();++i)   
    {   
        aa[i]=a[v[nod][i]];   
    }   
    sort(aa,aa+v[nod].sz());   
    for (i=v[nod].sz()-1;i>=0;--i)   
    {      
         sum+=i*aa[v[nod].sz()-i-1];      
         a[nod]+=aa[i];      
     }      
     sum+=a[nod];      
}      
  
       
      
void dfs2(int nod1, int nod2)      
{      
    int i;      
    a[nod1]=nod2;      
    for (i=0;i<v[nod1].sz();++i)      
    {      
        dfs2(v[nod1][i],nod2+i);      
    }      
}      
     
     
              
void citire()      
{      
    int i,x,y;      
    freopen(file_in,"r",stdin);      
    freopen(file_out,"w",stdout);      
          
    scanf("%ld", &n);      
    for (i=2;i<=n;++i)      
    {      
        scanf("%ld", &x);      
        v[x].pb(i);      
    }      
          
    for (i=1;i<=n;++i)      
    {      
        scanf("%ld", &y);      
        a[i]=y;      
        b[i]=y;      
    }      
}      
     
void solve()      
{      
    int i;      
          
    dfs1(1);      
          
    /*for (i=1;i<=n;++i)     
        sort(v[i].begin(),v[i].end(),cmp);   */  
          
    //dfs2(1,1);      
}      
     
void scrie()      
{      
    /*for (i=1;i<=n;++i)     
        // printf("%d ",a[i]);     
        sum+=b[i]*a[i];   */  
    printf("%lld", sum);      
}      
     
int main()      
{      
    citire();      
    solve();      
    scrie();      
          
    fclose(stdin);      
    fclose(stdout);      
          
    return 0;      
}