만드는 중입니다

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

트리를 쓰는 트리 문제

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

요약
각 정점의 부분트리를 부모에서 떼어 그 부분트리 안의 임의의 정점에 다시 붙일 때 만들 수 있는 트리의 최대 지름을 구합니다.
난이도

보통10점 중 7점

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

문제

경기과학고는 작년 말에 크리스마스 트리를 설치했다. 설치한 트리 TT는 정점이 NN개이며, 11번 정점이 루트이다. i>1i>1인 ii번 정점의 부모는 aia_i번 정점이다. TT의 부분 트리는 TT의 어떤 정점 XX에 대해, XX와 XX의 모든 자손 정점, 그리고 이들을 잇는 간선으로 이루어진 트리이다. TT의 지름은 TT의 임의의 두 점 사이 거리 중 가장 긴 값이다.

  • 지호: 성현아, 크리스마스 트리야!
  • 성현: 그렇네! 그런데 이 트리가 너무 작아 보여. 지름을 키울 방법이 없을까?
  • 지호: 음... TT의 루트를 포함하지 않는 부분 트리 T′T'를 잡으면, T′T'와 나머지 트리를 잇는 간선은 하나뿐이잖아?
  • 성현: 그렇지. 트리는 간선 하나를 없애면 무조건 두 연결 요소로 나뉘니까.
  • 지호: 그 간선이 T′T'의 정점 AA와 AA의 부모 BB를 잇는 간선일 때, T′T'에서 임의의 정점 CC를 골라 AA와 BB 사이 간선은 지우고 BB와 CC 사이에 간선을 추가하는 거야!
  • 성현: 오! 그렇게 하면 트리의 지름을 늘릴 수도 있겠구나!
  • 지호: 그런데 그렇게 해서 지름을 얼마나 키울 수 있을지는 모르겠어...
  • 성현: 음, 루트가 아닌 모든 정점 XX에 대해 XX와 그 부모 사이 간선을 끊고 새로 추가하는 방식을 생각해 보자. 이렇게 얻을 수 있는 트리의 최대 지름을 구할 수 있을 것 같은데?
  • 지호: 아! 그러면 O(N2)O(N^2) 미만에 해결할 수 있을 것 같아!

어떻게 해결한다는 걸까? 여러분이 한번 풀어 보자.

입력

첫 번째 줄에 NN이 주어진다.

두 번째 줄에 N−1N-1개의 양의 정수 a2,a3,⋯ ,aNa_2, a_3, \cdots, a_N이 공백으로 구분되어 주어진다.

출력

N−1N-1개 줄에 걸쳐, ii번째 줄에 i+1i+1번 정점을 루트로 하는 부분 트리를 떼어 붙여 얻을 수 있는 크리스마스 트리의 최대 지름을 출력한다.

제한

  • 2≤N≤300 0002 \leq N \leq 300\,000
  • 1≤ai<i1 \leq a_i < i (2≤i≤N2 \leq i \leq N)

힌트

지호가 O(N2)O(N^2) 미만에 해결할 수 있을 것 같다고 한 부분은, 엄밀히 말하면 모든 정점에 대해 o(N2)o(N^2) 시간에 해결할 수 있다는 뜻이다.

예제2

  1. 예제 1

    입력
    6
    1 1 1 3 3
    
    예상 출력
    3
    4
    3
    3
    3
    
  2. 예제 2

    입력
    10
    1 2 1 2 5 5 6 6 6
    
    예상 출력
    6
    5
    5
    6
    6
    5
    5
    5
    5