Cod sursa(job #263472)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 20 februarie 2009 14:08:18
Problema Dosare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
FILE*fin=fopen("dosare.in","r");
FILE*fout=fopen("dosare.out","w");
#define nm 16005
#define pb push_back
#define ll long long
int n,a[nm];
ll acc[nm],ans[nm];
vector<int> arb[nm];
inline int cmp(int a,int b){return acc[a]>acc[b];}
void findacc(int nod)
{
  int nnod,i;             
  for(i=0;i<arb[nod].size();i++) findacc(arb[nod][i]);
  sort(arb[nod].begin(),arb[nod].end(),cmp);
  acc[nod]=a[nod];
  ans[nod]=a[nod];
  for(i=0;i<arb[nod].size();i++)
  {
    nnod=arb[nod][i];                            
    acc[nod]+=acc[nnod];
    ans[nod]+=acc[nnod]*(i+1)+ans[nnod];
  }
}
int main()
{
    int i,x;
    fscanf(fin,"%d",&n);
    for(i=1;i<n;i++)
    {
      fscanf(fin,"%d",&x);
      arb[x].pb(i+1);
    }  
    for(i=1;i<=n;i++)
      fscanf(fin,"%d",&a[i]);
    findacc(1);
    fprintf(fout,"%lld",ans[1]);
    fclose(fin);
    fclose(fout);
    return 0;  
}