Cod sursa(job #220032)

Utilizator katakunaCazacu Alexandru katakuna Data 9 noiembrie 2008 12:12:05
Problema Dosare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<stdio.h>
#include<algorithm>
using namespace std;

long long *v[20011],nr[20011];
long long N,sol[20011],a[20011],n,i,x,s[20011],c[20011];

int cmp(long long A,long long B){
return a[A] > a[B];
}

void parc(long long x){
long long i;

  for(i=1;i<=v[x][0];i++){
  parc(v[x][i]);
  a[x]+=a[v[x][i]];
  }

}

void parc2(long long x,long long y){
long long 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,"%lld",&n);

  for(i=2;i<=n;i++){
  fscanf(f,"%lld",&x);
  nr[x]++;
  }
fclose(f);

for(i=1;i<=n;i++){
v[i]=new (long long) [nr[i]+2];
v[i][0]=0;
}

FILE *ff=fopen("dosare.in","r");
fscanf(ff,"%lld",&n);

  for(i=2;i<=n;i++){
  fscanf(ff,"%lld",&x);
  v[x][0]++;
  v[x][v[x][0]]=i;
  }

  for(i=1;i<=n;i++){
  fscanf(ff,"%lld",&a[i]);
  s[i]=a[i];
  }

  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);
long long rez=0;

  for(i=1;i<=n;i++){
  rez+=a[i]*s[i];
  }

  fprintf(g,"%lld",rez);
  
fclose(f);
fclose(g);

return 0;
}