Cod sursa(job #220015)

Utilizator katakunaCazacu Alexandru katakuna Data 9 noiembrie 2008 11:35:50
Problema Dosare Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include<stdio.h>
#include<algorithm>
using namespace std;

struct nod{long long inf;nod *urm;} *v[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){
nod *q;

   for(q=v[x];q!=NULL;q=q->urm){
   parc(q->inf);
   a[x]+=a[q->inf];
   }

}


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);
  nod *p=new nod;
  p->inf=i;
  p->urm=v[x];
  v[x]=p;
  }

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

  parc(1);

sol[1]=1;
nod *p;
long long j,rez=s[1];

   for(i=1;i<=n;i++){
   memset(c,0,sizeof(c));
   N=0;
      for(p=v[i];p!=NULL;p=p->urm){
      N++;
      c[N]=p->inf;
      }
   sort(c+1,c+N+1,cmp);
      for(j=1;j<=N;j++){
      sol[c[j]]=sol[i]+j;
      rez+=(sol[c[j]]*s[c[j]]);
      }
   }

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

fclose(f);
fclose(g);

return 0;
}