Cod sursa(job #308336)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 26 aprilie 2009 20:04:17
Problema Dosare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 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   
  
vector<int> v[Nmax];   
int a[Nmax];   
int b[Nmax];   
int n;   
int aa[Nmax];
int sum=0;
  
inline int cmp(int a,int b)   
{   
    return aa[a]>aa[b];   
}      
  
void dfs1(int nod)   
{   
    int 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+1,cmp);
	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("%d", &n);   
    for (i=2;i<=n;++i)   
    {   
        scanf("%d", &x);   
        v[x].pb(i);   
    }   
       
    for (i=1;i<=n;++i)   
    {   
        scanf("%d", &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()   
{   
    int i;   
    /*for (i=1;i<=n;++i)   
        // printf("%d ",a[i]);   
        sum+=b[i]*a[i];   */
    printf("%d", sum);   
}   
  
int main()   
{   
    citire();   
    solve();   
    scrie();   
       
    fclose(stdin);   
    fclose(stdout);   
       
    return 0;   
}