Cod sursa(job #253364)

Utilizator 630r63Ilinca George Mihai 630r63 Data 5 februarie 2009 18:26:28
Problema Dosare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
 #include<stdio.h>  
 #include<algorithm>  
 using namespace std;  
   
 int *v[20011],nr[20011];  
 int N,sol[20011],a[20011],n,i,x,s[20011],c[20011];  
   
 int cmp(int A,int B){  
 return a[A] > a[B];  
 }  
   
 void parc(int x){  
 int i;  
   
   for(i=1;i<=v[x][0];i++){  
   parc(v[x][i]);  
   a[x]+=a[v[x][i]];  
   }  
   
 }  
   
void parc2(int x,int y){  
 int i;  
   
 a[x]=y;  
   
   for(i=1;i<=v[x][0];i++){  
   parc2(v[x][i],y+i);  
   }  
   
 }  
   
   
 int main(){  
   
 FILE *f=fopen("dosare.in","r");  
 FILE *g=fopen("dosare.out","w");  
   
 fscanf(f,"%d",&n);  
   
   for(i=2;i<=n;i++){  
   fscanf(f,"%d",&x);  
   nr[x]++;  
   }  
     
 fclose(f);  
   
 for(i=1;i<=n;i++){  
 v[i]=new int [nr[i]+3];  
 v[i][0]=0;  
 }  
   
 FILE *ff=fopen("dosare.in","r");  
 fscanf(ff,"%d",&n);  
   
   for(i=2;i<=n;i++){  
   fscanf(ff,"%d",&x);  
   v[x][0]++;  
   v[x][v[x][0]]=i;  
   }  
   
   for(i=1;i<=n;i++){  
   fscanf(ff,"%d",&a[i]);  
   s[i]=a[i];  
   }  
   
   
 long long rez=0;  
   
   parc(1);  
   
     for(i=1;i<=n;i++)  
     sort(v[i]+1,v[i]+v[i][0]+1,cmp);  
   
 a[1]=1;  
   
 parc2(1,1);  
   
   for(i=1;i<=n;i++){  
   rez+=(long long)a[i]*(long long)s[i];  
   }  
   
   
   fprintf(g,"%lld",rez);  
   
     
 fclose(ff);  
 fclose(g);  
   
 return 0;  
}