현재 주요 정점들의 집합을 S라고 하자. S가 비어 있거나 원소가 하나뿐이면 답은 0이다.
트리를 1번 정점을 루트로 잡고 DFS를 한다. 정점 v의 DFS 방문 시각을 tin[v]라고 하자. S의 정점들을 tin이 증가하는 순서대로 v1,v2,…,vk라고 쓰고, vk+1=v1이라고 하자. 다음 값을 정의한다.
C(S)=i=1∑kdist(vi,vi+1)
이때 답은 C(S)/2이다.
이를 보이자. S의 모든 정점을 포함하는 최소 연결 부분트리를 TS라고 하자. TS의 임의의 간선 e를 제거하면 TS는 두 컴포넌트로 나뉘며, 양쪽 컴포넌트에는 각각 적어도 하나의 주요 정점이 있다. DFS 순서로 주요 정점들을 원형으로 나열하면 한쪽 컴포넌트에 있는 주요 정점들의 구간과 다른쪽 컴포넌트에 있는 주요 정점들의 구간 사이를 넘어가는 인접쌍이 정확히 두 번 생긴다. 따라서 C(S)에서 간선 e의 길이는 정확히 두 번 더해진다. 모든 간선에 대해 같은 논리가 성립하므로 C(S)=2∑e∈TSw(e)이고, 답은 C(S)/2이다.
이제 현재 주요 정점들을 tin 순서의 ordered set으로 관리하고, 현재 C(S) 값을 64비트 정수 변수로 유지한다.
정점 x를 추가한다고 하자. 현재 집합이 비어 있지 않다면, 원형 tin 순서에서 x의 바로 이전 정점을 p, 바로 다음 정점을 n이라고 하자. 기존에는 p와 n이 인접해 있었으므로 dist(p,n)이 더해져 있었다. x를 추가하면 이 항이 사라지고 dist(p,x)와 dist(x,n)이 생기므로 다음과 같이 갱신한다.
C←C+dist(p,x)+dist(x,n)−dist(p,n)
정점 x를 제거할 때는 반대로 다음 갱신을 적용한다.
C←C−dist(p,x)−dist(x,n)+dist(p,n)
집합의 크기가 0 또는 1인 경우에는 C=0으로 처리하면 된다.
거리 dist(u,v)는 LCA 전처리로 구한다. 루트에서 정점 v까지의 거리를 D[v]라고 하면 다음 식을 사용한다.
dist(u,v)=D[u]+D[v]−2D[lca(u,v)]
LCA 전처리에 O(NlogN) 시간이 걸린다. 각 사건마다 ordered set 연산과 LCA 거리 계산을 상수 번 수행하므로 O(logN) 시간에 처리된다. 전체 시간복잡도는 O((N+Q)logN)이고, 메모리복잡도는 O(NlogN)이다.
Solution written by GPT5.5