DOJ logoDOJ
문제
최근 추가된 문제들저장한 문제
카테고리DLC대회그룹팀게시판
랭킹
문제 풀이 랭킹스트릭 랭킹DOJ Power 랭킹
현황
문제 제안로그인회원가입
DOJ logoDOJ

OI 서브태스크 채점, Elo 레이팅, Discord 인증을 갖춘 커뮤니티 온라인 저지.

문제
문제 목록카테고리
커뮤니티
대회랭킹게시판공지사항외부 대회 개최이용 안내
계정
로그인회원가입채점 현황
정책
이용약관DLC 이용 규칙개인정보 처리방침API 사용 설명서언어별 채점 환경대회 순위 보상레이팅과 퍼포먼스
© 2026 DOJ
모든 권리 보유
해설

간선 이사

문제로 돌아가기

해설

삭제한 간선을 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