만드는 중입니다

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

트리 감염

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

요약
뿌리가 있는 트리에서 정점 s와 거리 R 이내의 자손을 감염시킬 때, 감염되지 않은 정점 중 서로 도달 가능한 쌍 (u, v)의 개수를 구합니다.
난이도

어려움10점 중 8점

유형
트리, 분할 정복, DFS
정답자
아직 제출이 없습니다

문제

루트가 있는 트리가 NN개의 정점으로 이루어져 있고, 정수 RR과 MM이 주어진다. 정점은 1부터 NN까지 번호가 매겨지며, 정점 1이 루트이다. 나머지 정점마다 부모가 하나씩 있다.

정점 ss를 고르면, ss와 ss의 자손(간선을 따라 아래로 내려가 도달할 수 있는 정점) 중 거리가 RR 이하인 정점이 함께 감염된다. 거리는 두 정점 사이의 간선 수이다. 정점 uu가 정점 vv로부터 도달 가능하다는 것은, 둘 다 감염되지 않았고 두 정점 사이 경로 위의 감염된 정점 수가 MM 이하인 경우이다.

선택할 수 있는 각 정점 ss (1≤s≤N1 \le s \le N)에 대해, 1≤u<v≤N1 \le u < v \le N이면서 uu가 vv로부터 도달 가능하고 그 반대도 성립하는 쌍 (u,v)(u, v)의 개수를 구하라.

입력

첫 번째 줄에 세 정수 NN, RR, MM이 주어진다.

두 번째 줄에는 N−1N - 1개의 정수 p[2],p[3],…,p[N]p[2], p[3], \dots, p[N]이 주어진다. p[i]p[i]는 정점 ii의 부모이다.

출력

NN개의 줄에 정수를 하나씩 출력한다. ss번째 줄에는 정점 ss를 선택했을 때의 쌍의 개수를 출력한다.

줄바꿈에는 std::endl 대신 '\n'을 쓰면 성능이 좋아지므로 권장한다.

제한

  • 2≤N≤500 0002 \le N \le 500\,000
  • 1≤p[i]<i1 \le p[i] < i (모든 2≤i≤N2 \le i \le N에 대해)
  • 0≤R≤N−10 \le R \le N - 1
  • 0≤M≤2×R+10 \le M \le 2 \times R + 1

예제2

  1. 예제 1

    입력
    13 2 2
    1 2 3 4 3 6 6 8 2 10 11 1
    
    예상 출력
    16
    4
    15
    55
    66
    36
    66
    55
    66
    45
    55
    66
    66
  2. 예제 2

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