Cod sursa(job #2020972)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 12 septembrie 2017 14:42:54
Problema Dosare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fi ("dosare.in");
ofstream fo ("dosare.out");

int p[16001], uk[16001];
vector <int> k[16001];
vector <long long> vs;

long long acc[16001];

bool cmp(long long a, long long b){
    return a > b;
}

int main()
{
    long long T;
    int n, i, j;
    ios::sync_with_stdio(false);
    fi >> n;
    for(i = 2; i <= n; i++){
        fi >> p[i];
        k[p[i]].push_back(i);
        uk[p[i]]++;
    }
    T = 0;
    for(i = 1; i <= n; i++)
        fi >> acc[i];
    while(uk[1] != -1000)
        for(i = 1; i <= n; i++)
            if(uk[i] == 0){
                if(k[i].size() > 0){
                    for(j = 0; j < k[i].size(); j++){
                        acc[i] += acc[k[i][j]];
                        vs.push_back(acc[k[i][j]]);
                    }
                    sort(vs.begin(), vs.end(), cmp);
                    for(j = 0; j < vs.size(); j++)
                        T += j * vs[j];//numerotam mutarile
                    vs.clear();
                }
                T += acc[i];//numaram enterurile
                uk[p[i]] --;
                uk[i] = -1000;
            }
    fo << T;
    return 0;
}