4063 – Cartierul

From Bitnami MediaWiki

Cerința[edit]

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[edit]

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[edit]

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[edit]

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

Exemplu:[edit]

Intrare

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

Ieșire

3 1 2 1 1

Rezovlare[edit]

<syntaxhighlight lang="python3"> 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)))

</syntaxhighlight>