Cod sursa(job #2029642)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 30 septembrie 2017 12:21:03
Problema Dosare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int v[16001],t[16001],ff[16001];
long long f[16001];
void frecv (int nod,int x){
    while (nod>0){
        f[nod]+=x;
        nod=t[nod];
    }
}
int drum (int nod){
    int sol=0;
    while (nod>0){
        sol=sol+v[nod]+1;
        nod=t[nod];
    }
    return sol;
}
pair <int,pair <long long,int> > w[16001];
int main()
{
    FILE *fin=fopen ("dosare.in","r");
    FILE *fout=fopen ("dosare.out","w");
    int n,i,nr;
    long long sol;
    fscanf (fin,"%d",&n);
    for (i=2;i<=n;i++)
        fscanf (fin,"%d",&t[i]);
    for (i=1;i<=n;i++){
        fscanf (fin,"%d",&ff[i]);
        frecv (i,ff[i]);
    }
    // v[i] = al catelea subfolder e i can intri in folderul tata
    for (i=1;i<=n;i++){
        w[i].first=t[i];
        w[i].second.first=-f[i];
        w[i].second.second=i;
    }
    sort (w+1,w+n+1);
    nr=-1;
    for (i=1;i<=n;i++){
        if (w[i].first!=w[i-1].first)
            nr=0;
        else nr++;
        v[w[i].second.second]=nr;
    }
    sol=0;
    for (i=1;i<=n;i++)
        sol=sol+ff[i]*drum(i);
    fprintf (fout,"%lld",sol);
    return 0;
}