3개의 배열과 트리

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

요약
정점 N개 트리를 세 배열로 예산 안에서 인코딩한 뒤 두 배열만으로 트리를 복원하는 투 스텝 문제다.
난이도

어려움10점 중 10점

유형
트리, 구현, 수학, 비트 연산
정답자
아직 제출이 없습니다

문제

이 문제는 투 스텝 문제입니다.

준혁이는 당신에게 정점 NN개의 트리 하나를 빌려주었다. 당신은 트리를 보고 감명받아 길이 NN의 배열 33개에 2N2N보다 작거나 같은 음이 아닌 정수로 값을 채워 넣어 트리를 표현하려고 한다. 각 배열은 다음과 같이 그 가치가 정해진다.

  • 첫 번째 배열은 배열의 값의 합이 그 가치가 된다.
  • 두 번째 배열 또한 배열의 값의 합이 그 가치가 된다.
  • 세 번째 배열은 배열의 값을 모두 XOR한 결과에 NN을 곱한 값이 그 가치가 된다.

33가지 배열의 가치의 합이 2N⋅⌊log⁡_2N⌋22N \cdot \left \lfloor{\log\_{2}N}\right \rfloor^2를 넘어선 안 된다.

긴 시간이 지난 후, 준혁이는 트리를 다시 가져갔고, 당신은 33가지 배열 중 하나의 배열을 잃어버렸다. 당신은 잃어버리지 않은 나머지 두 배열을 보고 어떤 트리를 보고 만든 배열인지 알아내 가져간 트리를 다시 복원해야 한다.

입력

당신의 프로그램은 채점 데이터 하나당 총 두 번 실행된다. 당신은 하나의 소스코드에 두 가지 실행 과정을 모두 구현해야 한다.

모든 입력의 첫 줄에는 실행 단계를 나타내는 정수 TT가 입력된다. (1≤T≤2)(1 \leq T \leq 2)

만약 TT가 11이라면 첫 번째 단계를 수행해야 하고, TT가 22라면 두 번째 단계를 수행하면 된다.

예제2

  1. 예제 1

    입력
    1
    5
    1 2
    1 3
    3 4
    3 5
    
    예상 출력
    0 1 2 0 0
    0 1 0 1 0
    3 1 3 2 0
    
  2. 예제 2

    입력
    2
    5
    3 1 3 2 0
    0 1 2 0 0
    
    예상 출력
    1 2
    5 3
    3 1
    3 4