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

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

트리와 집합과 쿼리

시간 제한4초메모리 제한512 MB

요약
트리에서 질의마다 정점 u를 U에, v를 V에 추가할 때, U의 돌을 한 번에 한 칸씩 옮겨 V로 만들 수 있는지 판정하고 그 값들의 합을 구합니다.
난이도

어려움10점 중 9점

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

문제

NN개의 정점으로 이루어진 트리가 있다.

트리의 정점들 위에 돌을 놓을 수 있다. 한 정점에는 돌을 하나만 놓을 수 있다.

이 트리에는 특이한 성질이 있다. 인접한 두 정점에는 돌을 모두 놓을 수 없다.

트리 정점들의 부분집합 AA와 BB에 대해, AA에 포함된 정점에만 돌이 놓인 상태에서 시작하여 돌을 인접한 정점으로 옮기는 작업만 반복해서 BB에 포함된 정점에만 돌이 놓인 상태를 만들 수 있다면 f(A,B)=1f(A,B) = 1로 하고, 그렇지 않으면 f(A,B)=0f(A,B) = 0으로 함수 ff를 정의하자. 물론 옮기는 중간 과정에서도 인접한 두 정점에 돌이 동시에 놓여서는 안 된다.

당신의 과제는 여러 집합 쌍에 대해 ff의 값을 계산하는 것이다.

처음에 두 집합 UU, VV는 빈 집합이다. 각 쿼리는 두 정수 uu, vv로 이루어져 있고, QQ개의 쿼리가 주어진다. 쿼리 하나는 UU에 정점 uu를, VV에 정점 vv를 추가한다.

쿼리를 하나 처리할 때마다 f(U,V)f(U,V)의 값을 계산한다. 마지막으로 QQ개의 값을 모두 더한 합을 출력하시오.

입력

첫째 줄에 테스트 케이스의 개수를 나타내는 자연수 TT가 주어진다. 이후 TT개의 테스트 케이스가 차례로 주어진다. (1≤T≤541 \le T \le 54)

각 테스트 케이스의 첫 줄에는 트리의 정점 개수 NN이 주어진다. (1≤N≤200,0001 \le N \le 200,000)

이어지는 N−1N-1개의 줄 각각에는 간선의 양 끝점을 나타내는 두 정수 aa와 bb가 주어진다. (1≤a≠b≤N1 \le a \ne b \le N)

다음 줄에는 쿼리의 개수 QQ가 주어진다. (1≤Q≤N1 \le Q \le N)

이어지는 QQ개의 줄 각각에는 UU와 VV에 추가될 정점 uu와 vv가 주어진다. (1≤u,v≤N1 \le u, v \le N)

QQ개의 쿼리가 끝난 뒤 집합 UU와 집합 VV는 인접한 두 정점을 포함하지 않음이 보장된다.

모든 테스트 케이스의 NN의 합은 2,000,000을 넘지 않는다.

출력

각 테스트 케이스마다 첫 줄에 "Case #C"를 출력한다. 여기서 CC는 테스트 케이스의 번호이다. 다음 줄에는 계산한 QQ개의 f(U,V)f(U,V) 값의 합을 출력한다.

예제1

  1. 예제 1

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