DOJ logoDOJ
Problems
Recently added problemsSaved problems
CategoriesDLCContestsGroupsTeamsBoard
Ranking
Solved Problem RankingStreak rankingDOJ Power ranking
Status
Call for TasksLoginRegister
DOJ logoDOJ

Community online judge with OI-style subtask scoring, Elo ratings, and Discord-backed certification.

Problems
ProblemsCategories
Community
ContestsRankingBoardNoticesHost an external contestGuide
Account
LoginRegisterJudge Status
Policy
Terms of ServiceDLC RulesPrivacyAPI documentationLanguage runtimesContest rank rewardsRating and performance
© 2026 DOJ
All rights reserved
Editorial

서브트리의 최소 길이합

Back to problem

Editorial

현재 주요 정점들의 집합을 SSS라고 하자. SSS가 비어 있거나 원소가 하나뿐이면 답은 000이다.

트리를 111번 정점을 루트로 잡고 DFS를 한다. 정점 vvv의 DFS 방문 시각을 tin[v]tin[v]tin[v]라고 하자. SSS의 정점들을 tintintin이 증가하는 순서대로 v1,v2,…,vkv_1,v_2,\ldots,v_kv1​,v2​,…,vk​라고 쓰고, vk+1=v1v_{k+1}=v_1vk+1​=v1​이라고 하자. 다음 값을 정의한다.

C(S)=∑i=1kdist(vi,vi+1)C(S)=\sum_{i=1}^{k} dist(v_i,v_{i+1})C(S)=i=1∑k​dist(v

이때 답은 C(S)/2C(S)/2C(S)/2이다.

이를 보이자. SSS의 모든 정점을 포함하는 최소 연결 부분트리를 TST_STS​라고 하자. TST_STS​의 임의의 간선 ee를 제거하면 는 두 컴포넌트로 나뉘며, 양쪽 컴포넌트에는 각각 적어도 하나의 주요 정점이 있다. DFS 순서로 주요 정점들을 원형으로 나열하면 한쪽 컴포넌트에 있는 주요 정점들의 구간과 다른쪽 컴포넌트에 있는 주요 정점들의 구간 사이를 넘어가는 인접쌍이 정확히 두 번 생긴다. 따라서 에서 간선 의 길이는 정확히 두 번 더해진다. 모든 간선에 대해 같은 논리가 성립하므로 이고, 답은 이다.

이제 현재 주요 정점들을 tintintin 순서의 ordered set으로 관리하고, 현재 C(S)C(S)C(S) 값을 64비트 정수 변수로 유지한다.

정점 xxx를 추가한다고 하자. 현재 집합이 비어 있지 않다면, 원형 tintintin 순서에서 xxx의 바로 이전 정점을 ppp, 바로 다음 정점을 nnn이라고 하자. 기존에는 ppp와 이 인접해 있었으므로 이 더해져 있었다. 를 추가하면 이 항이 사라지고 와 이 생기므로 다음과 같이 갱신한다.

C←C+dist(p,x)+dist(x,n)−dist(p,n)C\leftarrow C+dist(p,x)+dist(x,n)-dist(p,n)C←C+dist(p,x)+dist(x,n)−

정점 xxx를 제거할 때는 반대로 다음 갱신을 적용한다.

C←C−dist(p,x)−dist(x,n)+dist(p,n)C\leftarrow C-dist(p,x)-dist(x,n)+dist(p,n)C←C−dist(p,x)−dist(x,n)+

집합의 크기가 000 또는 111인 경우에는 C=0C=0C=0으로 처리하면 된다.

거리 dist(u,v)dist(u,v)dist(u,v)는 LCA 전처리로 구한다. 루트에서 정점 vvv까지의 거리를 D[v]D[v]D[v]라고 하면 다음 식을 사용한다.

dist(u,v)=D[u]+D[v]−2D[lca(u,v)]dist(u,v)=D[u]+D[v]-2D[lca(u,v)]dist(u,v)=D[u]+D[v]−2D[lc

LCA 전처리에 O(Nlog⁡N)O(N\log N)O(NlogN) 시간이 걸린다. 각 사건마다 ordered set 연산과 LCA 거리 계산을 상수 번 수행하므로 O(log⁡N)O(\log N)O(logN) 시간에 처리된다. 전체 시간복잡도는 O((N+Q)log⁡N)O((N+Q)\log N)O((N+이고, 메모리복잡도는 이다.

Solution written by GPT5.5

i​
,
vi+1​
)
e
TST_STS​
C(S)C(S)C(S)
eee
C(S)=2∑e∈TSw(e)C(S)=2\sum_{e\in T_S}w(e)C(S)=2∑e∈TS​​w(e)
C(S)/2C(S)/2C(S)/2
nn
n
dist(p,n)dist(p,n)dist(p,n)
xxx
dist(p,x)dist(p,x)dist(p,x)
dist(x,n)dist(x,n)dist(x,n)
dist(p,n)
dist(p,n)
a
(
u
,
v
)]
Q
)
log
N
)
O(Nlog⁡N)O(N\log N)O(NlogN)