만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

트리와 XOR

면접 대비

시간 제한3초메모리 제한1024 MB

요약
각 정점 r을 루트로 할 때, 부분트리에 xor 연산을 적용해 모든 a_i를 같게 만드는 최소 비용 m_r을 구합니다.
난이도

보통10점 중 6점

유형
트리, DFS, 동적 계획법
정답자
아직 제출이 없습니다

문제

정점이 nn개인 트리가 주어진다. 각 정점에는 11부터 nn까지의 번호가 붙어 있고, ii번 정점에는 정수 aia_i가 쓰여 있다. 당신은 원하는 만큼 시행을 하여 모든 aia_i를 같게 만들어야 한다.

한 번의 시행에서 당신은 정점 vv와 음이 아닌 정수 cc를 선택한다. 그 다음 vv를 루트로 하는 서브트리의 모든 정점 ii에 대하여, aia_i를 ai⊕ca_i \oplus c로 바꾼다. vv를 루트로 하는 서브트리의 크기를 ss라 할 때, 이 시행의 비용은 s⋅cs \cdot c이다. ⊕\oplus는 bitwise XOR을 의미한다.

rr번 정점이 트리의 루트일 때 목표를 달성하기 위한 최소 비용을 mrm_r이라 하자. m1,m2,…,mnm_1, m_2, \ldots, m_n을 구하여라.

입력

각 입력은 여러 개의 테스트 케이스로 이루어져 있다. 첫 번째 줄에 테스트 케이스의 개수 tt가 주어진다(1≤t≤1041 \le t \le 10^{4}). 다음 줄부터 각각의 테스트 케이스가 주어진다.

각각의 테스트 케이스의 첫 번째 줄에 정수 nn이 주어진다(1≤n≤2⋅1051 \le n \le 2 \cdot 10^{5}).

두 번째 줄에 nn개의 정수 a1,a2,…,ana_1, a_2, \ldots, a_n가 주어진다(0≤ai<2200 \le a_i < 2^{20}).

다음 n−1n-1개의 줄에 트리의 간선이 잇는 정점의 번호를 나타내는 두 정수 uu와 vv가 공백으로 구분되어 주어진다(1≤u,v≤n1 \le u, v \le n).

주어진 간선이 트리를 이룸이 보장된다.

모든 테스트 케이스에서 nn의 총합은 2⋅1052 \cdot 10^{5}를 넘지 않는다.

출력

각각의 테스트 케이스마다 nn개의 정수 m1,m2,…,mnm_1, m_2, \ldots, m_n을 공백으로 구분하여 출력한다.

힌트

첫 번째 테스트 케이스에서, 다음 방법으로 목표를 달성할 수 있다.

  1. 첫 번째 시행에서 v=2v=2, c=1c=1을 선택한다. 시행 후 a=[3,3,0,1]a=[3, 3, 0, 1]이 된다. 이 시행의 비용은 33이다.
  2. 두 번째 시행에서 v=3v=3, c=3c=3을 선택한다. 시행 후 a=[3,3,3,1]a=[3, 3, 3, 1]이 된다. 이 시행의 비용은 33이다.
  3. 세 번째 시행에서 v=4v=4, c=2c=2를 선택한다. 시행 후 a=[3,3,3,3]a=[3, 3, 3, 3]이 된다. 이 시행의 비용은 22이다.

이 과정의 총 비용은 3+3+2=83+3+2=8이다. 88 미만의 비용으로 목표를 달성하는 방법이 없음을 증명할 수 있다.

m2m_2, m3m_3, m4m_4도 마찬가지로 찾을 수 있다.

두 번째 테스트 케이스에서, 정점이 하나이므로 목표가 이미 달성되었다.

예제1

  1. 예제 1

    입력
    2
    4
    3 2 1 0
    1 2
    2 3
    2 4
    1
    100
    
    예상 출력
    8 6 12 10 
    0