트리 감염
시간 제한1초메모리 제한1024 MB
뿌리가 있는 트리에서 정점 s와 거리 R 이내의 자손을 감염시킬 때, 감염되지 않은 정점 중 서로 도달 가능한 쌍 (u, v)의 개수를 구합니다.
문제
루트가 있는 트리가 개의 정점으로 이루어져 있고, 정수 과 이 주어진다. 정점은 1부터 까지 번호가 매겨지며, 정점 1이 루트이다. 나머지 정점마다 부모가 하나씩 있다.
정점 를 고르면, 와 의 자손(간선을 따라 아래로 내려가 도달할 수 있는 정점) 중 거리가 이하인 정점이 함께 감염된다. 거리는 두 정점 사이의 간선 수이다. 정점 가 정점 로부터 도달 가능하다는 것은, 둘 다 감염되지 않았고 두 정점 사이 경로 위의 감염된 정점 수가 이하인 경우이다.
선택할 수 있는 각 정점 ()에 대해, 이면서 가 로부터 도달 가능하고 그 반대도 성립하는 쌍 의 개수를 구하라.
입력
첫 번째 줄에 세 정수 , , 이 주어진다.
두 번째 줄에는 개의 정수 이 주어진다. 는 정점 의 부모이다.
출력
개의 줄에 정수를 하나씩 출력한다. 번째 줄에는 정점 를 선택했을 때의 쌍의 개수를 출력한다.
줄바꿈에는 std::endl 대신 '\n'을 쓰면 성능이 좋아지므로 권장한다.
제한
- (모든 에 대해)