RiseOJ는 solved.ac와 제휴 관계가 없습니다. 티어 아이콘 © solved.ac. solved.ac
포럼
KOI00022

이진 트리

Platinum IV 플래티넘 IV
난이도
1s
시간 제한
1024MB
메모리 제한
3
맞았습니다!!
3
제출 수
100.0%
정답률
레이팅

의견: 0

설명

모든 노드의 자식 노드가 \(0\)개 또는 \(2\)개인 이진 트리 \(T\)에 대해 \(S(T)\)의 값은 다음과 같이 정의한다.

  • \(T\)에서 노드 \(u\)를 루트로 하는 서브 트리는, \(u\)\(u\)의 자손 노드들로만 구성된 집합이다.
  • \(T\)중위 순회 수열 \(p(T)\)\(T\)를 중위 순회하면서 방문하는 노드들을 순서대로 나열한 수열로, 아래와 같이 정의할 수 있다.
    • \(T\)의 루트 노드를 \(r\)이라 하자. \([r]\)\(r\) 하나로만 구성된 길이 \(1\)의 수열이라고 하자.
    • 만약 \(r\)의 자식 노드가 \(0\)개라면, \(p(T)\)\([r]\)이다.
    • 만약 \(r\)의 자식 노드가 \(2\)개라면, \(r\)의 왼쪽 자식 노드를 루트로 하는 서브 트리가 \(X\), \(r\)의 오른쪽 자식 노드를 루트로 하는 서브 트리가 \(Y\)일 때, \(p(T)\)\(p(X)\), \([r]\), \(p(Y)\)을 순서대로 이어붙인 수열이다.
  • \(T\)의 리프 노드 개수를 \(k\)라고 하자. \(T\)의 리프 노드들에 \(1, 2, \cdots , k\)의 번호를 \(p(T)\)에서 나타나는 순서대 로 (즉, 중위 순회 방문 순서대로) 붙였다고 하자.
  • \(T\)의 서브 트리를 선택하면, 해당 서브 트리에 포함된 리프 노드들이 덮인다고 하자.
  • \(1 ≤ a ≤ b ≤ k\)일 때, \(f(a, b)\)는 리프 노드들 중 번호가 \(a\) 이상 \(b\) 이하인 리프 노드들만을 덮고 다른 리프 노드들은 덮지 않기 위해, \(T\)에서 선택해야 하는 최소 서브 트리 개수이다.
  • \(S(T)\)의 값은 \(1 ≤ a ≤ b ≤ k\)인 모든 \((a, b)\) 정수 순서쌍에 대한 \(f(a, b)\)의 합을 \(10^9+7\)로 나눈 나머지이다.

예를 들어, 다음과 같은 이진 트리 \(T\)가 있다고 가정해보자.

(a) 만든 트리 (b) 리프 노드에 번호를 붙인 트리

\(f(5, 7)\)의 값은 \(2\)이다. 다음과 같이 서브 트리 두 개를 선택하면 \(5\), \(6\), \(7\)번 리프 노드만 덮이기 때문이다.

이런 식으로 모든 \(1 ≤ a ≤ b ≤ 7\)에 대해 \(f(a, b)\)의 값의 합은 \(47\)이고, 이를 \(10^9 + 7\)로 나눈 나머지를 구하면 \(S(T) = 47\)이다.


정수열 \(A_1, A_2, \cdots , A_N\)\(B_1, B_2, \cdots , B_N\)이 주어진다.

이진 트리 \(T_0, T_1, \cdots , T_N\)을 다음과 같이 정의한다.

  • \(T_0\)은 노드가 \(1\)개인 트리
  • \(T_i\) 는 루트의 왼쪽 자식 노드를 루트로 하는 서브 트리가 \(T_{A_i}\)이고, 루트의 오른쪽 자식 노드를 루트로 하는 서브 트리가 \(T_{B_i}\)인 트리 (\(1 ≤ i ≤ N\), \(0 ≤ A_i ≤ i - 1\), \(0 ≤ B_i ≤ i - 1\))

\(S(T_1), S(T_2), \cdots , S(T_N)\)을 구하는 프로그램을 작성하라.

제약
  • 주어지는 모든 수는 정수이다.
  • \(1 \le N \le 100\,000\)
  • \(0 \le A_i \le i - 1\) (\(1 \le i \le N\))
  • \(0 \le B_i \le i - 1\) (\(1 \le i \le N\))
입력 형식

첫 번째 줄에 정수 \(N\)이 주어진다.

다음 \(N\)개의 줄 중 \(i\) (\(1 ≤ i ≤ N\))번째 줄에는 \(A_i\)\(B_i\)가 공백으로 구분되어 주어진다.

출력 형식

\(N\)개의 줄을 출력한다. \(i\) (\(1 ≤ i ≤ N\))번째 줄에는 \(S(T_i)\)를 출력해야 한다.

서브태스크
서브태스크점수설명

1

5점

\(A_i = B_i = i - 1\) (\(1 \le i \le N\)), \(N \le 10\).

2

10점

\(A_i = B_i = i - 1\) (\(1 \le i \le N\)).

3

5점

\(A_i = i - 1\), \(B_i = 0\) (\(1 \le i \le N\)).

4

10점

\(T_1, T_2, \cdots, T_N\)의 노드 개수의 합은 \(1\,000\) 이하.

5

25점

\(T_1, T_2, \cdots, T_N\)의 노드 개수의 합은 \(300\,000\) 이하.

6

45점

추가 제약 조건 없음.

예제 1
입력
5
0 0
1 0
1 2
3 1
4 4
출력
3
7
21
47
254
예제 2
입력
7
0 0
1 1
2 2
3 3
4 4
5 5
6 6
출력
3
13
65
337
1729
8641
41985
문제 정보

riseoj 작성

출처 올림피아드 > 한국정보올림피아드 > KOI 2024 > 1차 대회 > 중등부 3번 / 고등부 2번

평가 및 의견

이진 트리

개요
출제자 난이도 Platinum IV 플래티넘 IV 의견 0 / 50 공개 집계 (커뮤니티 난이도, 주요 주제, 품질)는 의견이 충분히 모이면 공개됩니다.

Log in to rate problems.

개별 의견

아직 의견이 없습니다. 자격이 된다면 위 양식에서 가장 먼저 평가해 보세요.

풀이 제출

이진 트리

게스트로 둘러보고 있습니다. 로그인하면 풀이를 제출하고 진행 상황을 확인할 수 있습니다. 로그인하고 제출하기
공개
C++20 Tab 들여쓰기 · Ctrl+/ 주석 토글 · Enter 자동 들여쓰기
1 1 1 0 공백: 4 · UTF-8