Nu aveti permisiuni pentru a descarca fisierul grader_test10.ok
Cod sursa(job #2089065)
| Utilizator | Data | 16 decembrie 2017 10:41:17 | |
|---|---|---|---|
| Problema | Dosare | Scor | 100 |
| Compilator | cpp | Status | done |
| Runda | Arhiva de probleme | Marime | 0.92 kb |
#include <bits/stdc++.h>
using namespace std;
int n;
int TT[16006], l[16006];
long long a[16006];
vector <int> v[16006];
inline void dfs(int nod){
for(auto it : v[nod]){
dfs(it);
a[nod] += a[it];
}
}
inline bool cmp(int x, int y){
return a[x] > a[y];
}
int main(){
freopen("dosare.in", "r", stdin);
freopen("dosare.out", "w", stdout);
scanf("%d", &n);
for(int i = 2; i <= n ; ++i){
scanf("%d", &TT[i]);
v[TT[i]].push_back(i);
}
for(int i = 1; i <= n ; ++i)
scanf("%lld", &a[i]);
dfs(1);
long long Sol = a[1];
for(int i = 1; i <= n ; ++i){
if(v[i].empty()) continue ;
int NR = 0;
for(auto it : v[i]) l[++NR] = it;
sort(l + 1, l + NR + 1, cmp);
for(int i = 1; i <= NR ; ++i)
Sol = Sol + 1LL * (i - 1) * a[l[i]] + a[l[i]];
}
printf("%lld", Sol);
return 0;
}
