[BOJ 25207] 바벨탑의 저주

View as PDF

Submit solution

Points: 4
Time limit: 2.0s
Memory limit: 1G

Problem types
Allowed languages
Assembly, Awk, C, C++, Java, Pascal, Perl, Python, Sed, Text

바벨탑은 $N$개의 방이 $N$ - 1개의 통로로 연결된 이차원 건축물이다. 어떤 방들은 저주의 방으로, 접근하면 화를 입는다고 한다.</p>

탑은 아래 그림과 같이 방과 통로가 각각 노드와 간선인 트리 그래프로 도식화할 수 있다. 각 노드에는 1 이상 $N$ 이하의 고유한 노드 번호가 있고, 번호가 $i$인 노드에는 중복될 수 있는 정수 $a_i$가 적혀있다. 루트 노드의 번호는 항상 1번이다. 한 부모 노드에게 자식 노드가 여럿이라면 노드 번호가 더 작은 자식이 왼쪽에 있다.

번호가 $i$인 노드를 루트 노드로 하며 그 노드의 부모 노드를 포함하지 않는 가장 큰 서브트리를 $T_i$라고 하자. $i$번 노드를 좌우로 뒤집으면 $T_i$에 속하는 모든 노드에 대해, 반대로 노드 번호가 더 큰 자식이 왼쪽에 있게 된다.

저주 노드란 좌우로 뒤집어도 전체 트리의 구조와 노드에 적힌 정수가 원래와 일치하는 노드이다. 위 그림에서 저주 노드들은 파란 테두리로 표시되어 있다. 당신의 임무는 모든 저주 노드의 번호를 알아내는 것이다.

입력 형식

첫째 줄에 노드의 수 $N$이 주어진다.</p>

둘째 줄에 $a_1$부터 $a_N$까지의 $N$개의 정수가 공백으로 구분되어 주어진다.

다음 $N$ - 1 개의 줄에 걸쳐 두 정수 $i$, $j$가 공백으로 구분되어 주어진다. $i$번 노드가 $j$번 노드의 부모라는 뜻이다.

출력 형식

첫째 줄에 저주 노드의 수를 출력한다.</p>

둘째 줄에 저주 노드들의 노드 번호를 작은 수부터 공백으로 구분하여 출력한다.

예제 입력 1

7
9 3 2 2 4 4 3
1 3
1 4
3 2
3 6
4 5
4 7

예제 출력 1

5
1 2 5 6 7

예제 입력 2

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

예제 출력 2

4
2 3 4 5

예제 입력 3

13
3 5 2 9 6 8 4 4 1 6 5 8 8
1 2
1 3
1 11
11 10
11 8
11 7
11 5
7 4
7 9
2 6
6 12
2 13

예제 출력 3

9
3 4 5 6 8 9 10 12 13

예제 입력 4

1
-3

예제 출력 4

1
1

Comments

There are no comments at the moment.