만드는 중입니다

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

트리 균형 맞추기

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

요약
각 노드의 점 개수를 주어진 범위 안에서 정하여 조상과 자손 사이 차이의 최댓값을 가장 작게 만듭니다.
난이도

보통10점 중 7점

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

문제

농부 존은 여러 소 품종의 진화를 깊이 연구해 왔다. 그 결과는 NN개 (2≤N≤1052\le N\le 10^5)의 노드로 이루어진 루트 달린 트리이며, 노드에는 1…N1\ldots N번 번호가 붙어 있고 각 노드는 소 품종 하나에 대응한다. 각 i∈[2,N]i\in [2,N]에 대해 노드 ii의 부모는 노드 pip_i (1≤pi<i1\le p_i < i)이며, 이는 품종 ii가 품종 pip_i에서 진화했다는 뜻이다. 노드 jj는 j=pij=p_i이거나 jj가 pip_i의 조상이면 노드 ii의 조상이라고 한다. 트리의 모든 노드 ii에는 반점 수 sis_i(정수)를 가진 품종이 대응한다. 트리의 불균형도는 jj가 ii의 조상인 모든 노드 쌍 (i,j)(i,j)에 대한 ∣si−sj∣|s_i-s_j|의 최댓값으로 정의한다. 농부 존은 각 품종의 sis_i 정확한 값은 모르지만 그 하한과 상한은 알고 있다. 여러분의 과제는 각 노드에 정수 si∈[li,ri]s_i\in[l_i,r_i] (0≤li≤ri≤1090\le l_i\le r_i\le 10^9)를 배정하여 트리의 불균형도를 최소화하는 것이다.

입력

첫 줄에는 테스트케이스의 수 TT (1≤T≤101\le T\le 10)와 정수 B∈{0,1}B\in\{0,1\}이 주어진다. 각 테스트케이스는 NN이 적힌 줄로 시작하고, 이어서 N−1N-1개의 정수 p2,p3,…,pNp_2,p_3,\ldots,p_N이 적힌 줄이 주어진다. 다음 NN개 줄에는 각각 두 정수 lil_i와 rir_i가 주어진다. 모든 테스트케이스의 NN을 합하면 10510^5를 넘지 않는다고 보장된다.

출력

각 테스트케이스마다 BB의 값에 따라 한 줄 또는 두 줄을 출력한다. 첫 줄에는 최소 불균형도를 출력한다. B=1B=1이면 위의 불균형도를 달성하는 배정 s1,s2,…,sNs_1,s_2,\ldots,s_N을 공백으로 구분해 한 줄 더 출력한다. 올바른 배정이라면 어떤 것이든 받아들여진다.

예제2

  1. 예제 1

    입력
    3 0
    3
    1 1
    0 100
    1 1
    6 7
    5
    1 2 3 4
    6 6
    1 6
    1 6
    1 6
    5 5
    3
    1 1
    0 10
    0 1
    9 10
    
    예상 출력
    3
    1
    4
    
  2. 예제 2

    입력
    3 1
    3
    1 1
    0 100
    1 1
    6 7
    5
    1 2 3 4
    6 6
    1 6
    1 6
    1 6
    5 5
    3
    1 1
    0 10
    0 1
    9 10
    
    예상 출력
    3
    3 1 6
    1
    6 5 5 5 5
    4
    5 1 9