DOJ logoDOJ
题目
最近添加的题目收藏的题目Workbooks
分类DLC比赛小组团队讨论区
排名
解题数量排行榜连续解题排名DOJ Power 排行榜
评测状态
征题登录注册
DOJ logoDOJ

支持 OI 子任务计分、Elo 等级分和 Discord 认证的社区在线评测系统。

题目
题目列表分类
社区
比赛排名讨论区公告举办外部比赛指南
账号
登录注册评测状态
政策
服务条款DLC 使用规则隐私政策API 文档语言运行环境比赛排名奖励评级与表现
© 2026 DOJ
保留所有权利
题解

Moving an Edge

返回题目

题解

삭제한 간선을 uv1uv_1uv1​, 새로 추가한 간선을 uv2uv_2uv2​라고 하자. 여기서 v2v_2v2​는 uv1uv_1uv1​을 삭제했을 때 v1v_1v1​이 속하는 연결 컴포넌트에 있다.

먼저 다음 두 표준화 보조정리를 사용한다.

보조정리 1

최적해 중에는 삭제한 간선과 추가한 간선이 한 끝점 uuu를 공유하는 것이 존재한다.

일반적인 연산에서 삭제한 간선을 ababab, 추가한 간선을 cdcdcd라 하고, a,ca,ca,c가 같은 연결 컴포넌트에 있다고 하자. 두 컴포넌트 내부의 거리는 변하지 않는다. 서로 다른 컴포넌트의 정점 x,yx,yx,y에 대해서만

dist⁡(x,c)−dist⁡(x,a)+dist⁡(d,y)−dist⁡(b,y)\operatorname{dist}(x,c)-\operatorname{dist}(x,a) + \operatorname{dist}(d,y)-\operatorname{dist}(b,y)dist(x,c)−dist(x,a)+dist(d,y)−

의 값이 000인지 확인하면 된다.

각 차이는 대응하는 두 정점을 잇는 경로를 따라 일정하게 증가하거나 감소하며, 경로에 붙은 서브트리에서는 같은 값을 가진다. 두 경로의 값 구간을 겹치는 순서대로 비교하고, 처음과 마지막으로 상쇄되는 층을 기준으로 간선을 옮기면 한쪽 새 끝점을 원래 끝점으로 바꾸어도 변화한 쌍의 수가 증가하지 않는다. 이 과정을 반복하면 한 끝점을 공유하는 최적해를 얻는다.

보조정리 2

uuu가 리프가 아니라면 dist⁡(v1,v2)≤2\operatorname{dist}(v_1,v_2)\le2dist(v1​,v2​)≤2인 최적해가 존재한다.

dist⁡(v1,v2)≥3\operatorname{dist}(v_1,v_2)\ge3dist(v1​,v2​)≥3인 연산을 생각하자. v1v_1v과 사이 경로의 양쪽 끝 방향 컴포넌트에서 가장 가까운 리프를 택해 같은 중간 지점을 기준으로 옮길 수 있다. 이 리프 이동에서 변화하는 쌍은 원래 연산에서 변화하는 서로 다른 컴포넌트 쌍의 한 층에 포함된다. 가 리프가 아니므로 쪽 컴포넌트의 크기는 이상이고, 원래 연산의 변화량은 이 층의 크기만큼을 적어도 두 번 포함한다. 따라서 리프 이동이 더 나쁘지 않다.

이제 한 끝점을 공유하는 연산만 계산한다.

uv1uv_1uv1​을 삭제했을 때 uuu가 속하는 컴포넌트를 AAA, 다른 컴포넌트를 BBB라 하고 ∣A∣=a|A|=a라 하자. 내부와 내부의 거리는 변하지 않는다. , 에 대해서는

dist⁡T(x,y)=dist⁡(x,u)+1+dist⁡(v1,y),dist⁡T′(x,y)=dist⁡(x,u)+1+dist⁡(v2,y).\begin{align*} \operatorname{dist}_T(x,y) &=\operatorname{dist}(x,u)+1+\operatorname{dist}(v_1,y),\\ \operatorname{dist}_{T'}(x,y) &=\operatorname{dist}(x,u)+1+\operatorname{dist}(v_2,y). \end{align*}

따라서 yyy에 대한 두 거리의 비교 결과가 AAA의 모든 xxx에 똑같이 적용된다.

dist⁡(v1,v2)\operatorname{dist}(v_1,v_2)dist(v1​,v2​)가 홀수이면 두 정점에서 같은 거리에 있는 정점이 없다. 이때 변화량은

a∣B∣a|B|a∣B∣

이다.

거리가 짝수이면 경로의 가운데 정점을 mmm이라 하자. v1v_1v1​과 v2v_2v2​에서 같은 거리에 있는 정점은 mm에서 경로의 두 방향 간선을 제거했을 때 이 속하는 컴포넌트에 정확히 포함된다. 두 경로 방향의 컴포넌트 크기를 라 하면 변화량은

a(p+q)a(p+q)a(p+q)

이다.

거리 1인 경우

경로가 u−v1−v2u-v_1-v_2u−v1​−v2​라고 하자. uuu 방향 컴포넌트의 크기를 a라 하면 변화량은

a(N−a)a(N-a)a(N−a)

이다.

v1v_1v1​의 각 이웃 방향 컴포넌트 크기 중 하나를 aaa로 고를 수 있다. 함수 a(N−a)a(N-a)a(N−a)는 오목한 이차식이므로, 가능한 aaa 중 최솟값과 최댓값만 확인하면 된다.

거리 2인 경우

경로가

u−v1−m−v2u-v_1-m-v_2u−v1​−m−v2​

라고 하자.

m−v1m-v_1m−v1​을 제거했을 때 v1v_1v1​ 쪽 컴포넌트 크기를 SSS라 하자. 에서 방향 컴포넌트 크기를 , 에서 방향 컴포넌트 크기를 라 하면 변화량은

a(S−a+b)a(S-a+b)a(S−a+b)

이다.

고정된 방향 간선 v1→mv_1\to mv1​→m에 대해 bbb는 가능한 값 중 최솟값을 고르면 된다. a(S+b−a)a(S+b-a)a(S+b−도 오목한 이차식이므로, 방향을 제외한 컴포넌트 크기의 최솟값과 최댓값만 확인하면 된다.

각 정점에서 이웃 방향 컴포넌트 크기의 작은 값 두 개와 큰 값 두 개를 저장하면 모든 후보를 O(N)O(N)O(N)에 계산할 수 있다.

리프를 옮기는 경우

이제 uuu가 리프인 경우에는 v1v_1v1​과 v2v_2v2​의 거리가 길 수 있다.

거리가 홀수이면 uuu와 나머지 N−1N-1N−1개 정점 사이의 거리가 모두 변한다. 따라서 변화량은 N−1N-1N−1이다. 이는 항상 가능한 기본 상한이다.

거리가 2t2t2t이면 가운데 정점을 mmm이라 하자. mmm에서 uuu 방향의 가지를 XXX, v2v_2v 방향의 가지를 라 하고 크기를 각각 라 하자. 와의 거리가 변하는 정점은 에서 를 제외한 정점과 의 정점뿐이다. 변화량은

sX+sY−1s_X+s_Y-1sX​+sY​−1

이다.

mmm의 각 이웃 방향 가지에 대해 다음 값을 정의한다.

  • sss: 가지의 정점 수.
  • hhh: mmm에서 가지 안의 가장 먼 정점까지의 거리.
  • ℓ\ellℓ: mmm에서 가지 안의 가장 가까운 원래 트리의 리프까지의 거리.

가지 XXX가 기존 리프가 있는 방향이 되려면 ℓ≥2\ell\ge2ℓ≥2여야 한다. 가장 가까운 리프를 uuu로 고르면 t=ℓ−1t=\ell-1t=ℓ−1이다. 다른 가지 YY는 깊이 의 정점을 포함해야 하므로

hY≥ℓX−1h_Y\ge\ell_X-1hY​≥ℓX​−1

을 만족해야 한다.

따라서 각 가지 XXX에 대해 다음 질의를 계산하면 된다.

높이가 ℓX−1\ell_X-1ℓX​−1 이상인 다른 가지 중 크기의 최솟값

모든 방향 간선에 대한 s,h,ℓs,h,\ells,h,ℓ은 재루팅 DP로 구한다. 한 방향 간선의 컴포넌트 정보를 반대쪽 정점으로 전달하는 메시지에 컴포넌트 크기, 최대 깊이, 가장 가까운 리프 거리를 저장하면 된다.

각 정점별 질의를 정렬하면 O(Nlog⁡N)O(N\log N)O(NlogN)이지만, 높이와 리프 거리는 모두 000 이상 NNN 이하의 정수이다. 모든 가지를

dist
(
b
,
y
)
1​
v2v_2v2​
uuu
uuu
222
∣
A
∣
=
a
AAA
BBB
x∈Ax\in Ax∈A
y∈By\in By∈B
distT​(x,y)
distT′​(x,y)
​
=dist(x,u)+1+dist(v1​,y),=dist(x,u)+1+dist(v2​,y).​
m
mmm
p,qp,qp,q
a
a
v1v_1
v1​
uuu
aaa
mmm
v2v_2v2​
bbb
a
)
mmm
2
​
YYY
sX,sYs_X,s_YsX​,sY​
uuu
XXX
uuu
YYY
Y
ttt
(가운데 정점,−h)(\text{가운데 정점},-h)
(가운데 정점,−h)

순서로, 모든 질의를

(가운데 정점,−(ℓ−1))(\text{가운데 정점},-(\ell-1))(가운데 정점,−(ℓ−1))

순서로 계수 정렬한다. 같은 가운데 정점에서 높이가 큰 가지부터 추가하면서 크기가 작은 가지 두 개를 유지한다. 질의에 사용한 가지 자체를 제외해야 하므로 두 개를 저장한다.

계수 정렬과 스위프는 모두 O(N)O(N)O(N)이다.

전체 시간 복잡도는 O(N)O(N)O(N)이고, 메모리 복잡도는 O(N)O(N)O(N)이다.

Solution written by GPT5.6