Problema
O padrão composite trata objetos individuais e grupos de objetos da mesma forma. O tamanho de uma pasta é a soma dos seus próprios arquivos mais os tamanhos de tudo que está dentro dela, por mais profundo que esteja.
Há n itens numerados de 0 até n − 1 formando uma árvore. parents[i] é a pasta que contém o item i, ou -1 para a raiz (exatamente um item). sizes[i] é o tamanho do conteúdo próprio do item i.
Implemente composite_folder_sizes(parents, sizes).
Input
parents: O pai de cada item.
sizes: O tamanho próprio de cada item.
Output
Retorne, para cada item, seu tamanho total: seu próprio tamanho mais os totais de todos os seus filhos.
Restrições
1 ≤ n ≤ 100,000
0 ≤ sizes[i] ≤ 10^9; parents descreve uma única árvore
Exemplos
Entrada:
sizes = [1, 2, 3, 4]
parents = [-1, 0, 0, 1]
Saída esperada:
expected = [10, 6, 3, 4]
Entrada:
std::vector<long long> sizes = {1, 2, 3, 4};
std::vector<long long> parents = {-1, 0, 0, 1};
Saída esperada:
std::vector<long long> expected = {10, 6, 3, 4};
Entrada:
long[] sizes = new long[] {1, 2, 3, 4};
long[] parents = new long[] {-1, 0, 0, 1};
Saída esperada:
long[] expected = new long[] {10, 6, 3, 4};
Explicação
O item 3 (tamanho 4) está dentro do item 1, então o item 1 totaliza 2 + 4 = 6. A raiz contém os itens 1 e 2: 1 + 6 + 3 = 10. Resultado: [10, 6, 3, 4].
Entrada:
sizes = [5, 0, 7]
parents = [1, -1, 1]
Saída esperada:
expected = [5, 12, 7]
Entrada:
std::vector<long long> sizes = {5, 0, 7};
std::vector<long long> parents = {1, -1, 1};
Saída esperada:
std::vector<long long> expected = {5, 12, 7};
Entrada:
long[] sizes = new long[] {5, 0, 7};
long[] parents = new long[] {1, -1, 1};
Saída esperada:
long[] expected = new long[] {5, 12, 7};
Explicação
A raiz é o item 1 sem conteúdo próprio; ela contém os itens 0 e 2: 0 + 5 + 7 = 12.
Como abordar
Tente sozinho primeiro e depois abra uma dica de cada vez.
Dica 1
O total de uma pasta é o próprio tamanho mais os totais dos filhos.
Dica 2
Processe os filhos antes dos pais, por exemplo por profundidade decrescente.
Dica 3
Evite recursão profunda em cadeias longas; uma pilha explícita ou uma ordem é mais segura.
Complexidade esperada
tempo O(n), espaço extra O(n)
Referências
Este desafio foi adaptado para o CodeUtility. Siga o enunciado e as restrições acima.