아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

카운터스펠

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

요약
루트가 있는 트리에 검은 잎을 하나씩 붙일 때마다, 유일한 올바른 색칠을 회복하기 위해 색을 뒤집어야 하는 최소 정점 수를 구한다.
난이도

어려움10점 중 8점

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

문제

카드 게임 Magic: The Gathering에는 주문을 시전하고 상쇄하는 규칙이 있다. 아래 색칠 규칙은 여기에서 따왔다. 카드 게임 자체는 설명하지 않으며, 문제를 푸는 데 알 필요도 없다.

뿌리 있는 트리마다 다음 조건을 만족하도록 정점을 검은색과 흰색으로 칠하는 방법이 정확히 하나 있다.

  • 정점이 흰색인 것은 그 정점에 검은색 자식이 있는 경우, 그리고 그 경우뿐이다.

색칠이 유일하다는 사실은 귀납법으로 쉽게 증명할 수 있다. 이렇게 칠한 트리를 잘 칠한 트리라고 부른다.

검은색 정점 하나로 이루어진 트리에서 시작한다. 이 정점이 뿌리이다. 여기에 다음 연산을 nn번 수행한다.

  • add(v)add(v): 정점 vv의 자식으로 새로운 검은색 정점을 붙인다. 그다음 트리가 다시 잘 칠한 트리가 되도록 정점 몇 개의 색을 반전시킨다. 하나도 반전시키지 않을 수도 있고, 전부 반전시킬 수도 있다.

각 연산에서 색이 반전되는 정점이 몇 개인지 구하라.

입력

뿌리의 번호는 00이고, 나머지 정점은 트리에 추가되는 순서대로 1,2,…,n1, 2, \dots, n번을 받는다.

첫째 줄에 정점을 추가하는 횟수 nn이 주어진다. (1≤n≤2000001 \le n \le 200000)

다음 nn개 줄 중 ii번째 줄에는 ii번째 연산에서 추가하는 정점의 부모 번호 viv_i가 주어진다. 정점 viv_i는 ii번째 연산 전에 이미 존재한다. 즉, vi<iv_i < i이다.

출력

nn개 줄을 출력한다. ii번째 줄에는 ii번째 연산에서 색이 반전되는 정점의 개수를 출력한다. 그 연산에서 새로 붙인 정점은 검은색으로 붙었고 잎은 항상 검은색이므로, 반전되는 정점에 들어가지 않는다.

힌트

아래 그림은 첫 번째 예제의 시작 트리와 각 연산을 마친 뒤의 트리이다. 그 연산에서 색이 반전된 정점을 빨간 테두리로 표시했다.

첫 번째 예제의 트리 여섯 개. 시작 트리와 다섯 연산 각각을 마친 뒤의 트리이고, 그 연산에서 색이 반전된 정점에 빨간 테두리가 있다.

예제4

  1. 예제 1

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

    입력
    1
    0
    
    예상 출력
    1
    
  3. 예제 3

    입력
    6
    0
    0
    0
    0
    0
    0
    
    예상 출력
    1
    0
    0
    0
    0
    0
    
  4. 예제 4

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