Distance Sum Maximization

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

요약
트리에서 각 쿼리마다 모든 정점 x 중 dist(x,u)+dist(x,v)의 최댓값을 구해 출력한다.
난이도

어려움10점 중 8점

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

문제

NN개의 정점으로 이루어진 트리(사이클이 없는 무방향 연결 그래프)가 있다. 정점은 11번부터 NN번까지 번호가 매겨져 있고, 간선은 11번부터 (N−1)(N-1)번까지 번호가 매겨져 있다.

아래의 쿼리를 수행하는 프로그램을 작성하시오.

  • uu vv: 정점 xx(1≤x≤N1\le x\le N)에 대해, dist⁡(x,u)\operatorname{dist}(x,u) + dist⁡(x,v)\operatorname{dist}(x,v)의 최댓값을 출력한다. (1≤u,v≤N1\le u,v\le N)

이때 dist⁡(x,y)\operatorname{dist}(x,y)는 정점 xx에서 정점 yy로 가는 최단경로 상의 간선 개수로 정의한다. 트리의 모든 정점 xx에 대해 dist⁡(x,x)=0\operatorname{dist}(x,x) =0 이다.

입력

첫째 줄에 트리의 정점 수 NN가 주어진다. (2≤N≤300,0002\le N\le 300\\, 000)

다음 (N−1)(N-1)개의 줄에는 트리의 정보가 주어진다. 이중 ii번째 줄에는 ii번 간선이 연결하는 두 정점 번호가 공백을 사이에 두고 주어진다.

다음 줄에 쿼리의 수 QQ가 주어진다. (2≤Q≤300,0002\le Q\le 300\\, 000)

다음 줄부터 QQ개의 줄에는 쿼리의 정보가 한 줄에 하나씩 주어진다.

출력

QQ개의 줄에 쿼리의 답을 순서대로 출력한다.

예제1

  1. 예제 1

    입력
    5
    1 2
    2 3
    2 4
    4 5
    3
    1 3
    1 5
    2 3
    
    예상 출력
    6
    5
    5