4063 – Cartierul

De la Universitas MediaWiki

Cerința

Avem în cartier un arbore cu nodurile colorate și cu rădăcina nodul 1. Pentru fiecare nod i al arborelui să se afișeze câte culori distincte sunt în subarborele cu rădăcina în i.

Date de intrare

Programul citește de la tastatură numărul n, reprezentând numărul de noduri al arborelui. Pe a doua linie se vor afla n valori, cea de a i reprezentând culoarea nodului i. Urmează n-1 linii, pe fiecare linie aflânduse 2 numere a b indicând faptul ca între a și b este muchie.

Date de ieșire

Programul va afișa pe ecran n numere, cel de al i-lea fiind numărul de culori distincte din subarborele cu rădăcina în i.

Restricții și precizări

  • 1 ≤ n ≤ 200.000
  • Culorile arborelui sunt numere naturale mai mici sau egale cu 1.000.000.000

Exemplu:

Intrare

5
2 3 2 2 1
1 2
1 3
3 4
3 5

Ieșire

3 1 2 1 1

Rezovlare

from collections import defaultdict, deque


def distinct_colors_in_subtrees(n, colors, edges):
  
    tree = defaultdict(list)
    for a, b in edges:
        tree[a].append(b)
        tree[b].append(a)

    
    subtree_colors = [set() for _ in range(n + 1)]
    result = [0] * (n + 1)
    visited = [False] * (n + 1)

    def dfs(node):
        visited[node] = True
        subtree_colors[node].add(colors[node - 1])  # Add the color of the current node
        for neighbor in tree[node]:
            if not visited[neighbor]:
                dfs(neighbor)
                # Merge the color sets of the subtrees
                if len(subtree_colors[neighbor]) > len(subtree_colors[node]):
                    subtree_colors[node], subtree_colors[neighbor] = subtree_colors[neighbor], subtree_colors[node]
                subtree_colors[node].update(subtree_colors[neighbor])
        result[node] = len(subtree_colors[node])

    
    dfs(1)

    return result[1:]



n = int(input())
colors = list(map(int, input().split()))
edges = [tuple(map(int, input().split())) for _ in range(n - 1)]


result = distinct_colors_in_subtrees(n, colors, edges)


print("\n".join(map(str, result)))