Tous les défis
Moyen 0 résolus 0 % de réussite

Tailles de dossiers avec Composite

Calculer la taille totale de chaque dossier dans un arbre où les dossiers contiennent des fichiers et d'autres dossiers.

Ce que vous allez apprendre

  • Traiter éléments seuls et groupes de la même façon
  • Ajouter les totaux des enfants à leur parent
  • Parcourir un arbre des feuilles vers la racine

Problème

Le motif composite traite les objets simples et les groupes d'objets de la même façon. La taille d'un dossier est la taille de ses propres fichiers plus la taille de tout ce qu'il contient, quelle que soit la profondeur.

Il y a n éléments numérotés de 0 à n − 1 formant un arbre. parents[i] est le dossier qui contient l'élément i, ou -1 pour la racine (un seul élément). sizes[i] est la taille du contenu propre de l'élément i.

Implémentez composite_folder_sizes(parents, sizes).

Input

parents : le parent de chaque élément.

sizes : la taille propre de chaque élément.

Output

Retournez, pour chaque élément, sa taille totale : sa propre taille plus les totaux de tous ses enfants.

Contraintes

1 ≤ n ≤ 100,000

0 ≤ sizes[i] ≤ 10^9 ; parents décrit un seul arbre

Exemples

Exemple 1
Entrée :
sizes = [1, 2, 3, 4]
parents = [-1, 0, 0, 1]

Sortie attendue :
expected = [10, 6, 3, 4]
Entrée :
std::vector<long long> sizes = {1, 2, 3, 4};
std::vector<long long> parents = {-1, 0, 0, 1};

Sortie attendue :
std::vector<long long> expected = {10, 6, 3, 4};
Entrée :
long[] sizes = new long[] {1, 2, 3, 4};
long[] parents = new long[] {-1, 0, 0, 1};

Sortie attendue :
long[] expected = new long[] {10, 6, 3, 4};

Explication

L'élément 3 (taille 4) est à l'intérieur de l'élément 1, donc l'élément 1 totalise 2 + 4 = 6. La racine contient les éléments 1 et 2 : 1 + 6 + 3 = 10. Résultat : [10, 6, 3, 4].

Exemple 2
Entrée :
sizes = [5, 0, 7]
parents = [1, -1, 1]

Sortie attendue :
expected = [5, 12, 7]
Entrée :
std::vector<long long> sizes = {5, 0, 7};
std::vector<long long> parents = {1, -1, 1};

Sortie attendue :
std::vector<long long> expected = {5, 12, 7};
Entrée :
long[] sizes = new long[] {5, 0, 7};
long[] parents = new long[] {1, -1, 1};

Sortie attendue :
long[] expected = new long[] {5, 12, 7};

Explication

La racine est l'élément 1 sans contenu propre ; elle contient les éléments 0 et 2 : 0 + 5 + 7 = 12.

Comment l'aborder

Essayez d'abord seul, puis ouvrez les indices un par un.

Indice 1

Le total d'un dossier est sa propre taille plus les totaux de ses enfants.

Indice 2

Traitez les enfants avant les parents, par exemple par profondeur décroissante.

Indice 3

Évitez une récursion profonde sur de longues chaînes ; une pile explicite ou un ordre est plus sûr.

Complexité attendue

temps O(n), espace supplémentaire O(n)

Références

Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.

Apprenez des autres

Solutions de la communauté

Aucune solution publiée pour l'instant. Résolvez ce défi pour partager la première.