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

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

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

Identity

문제로 돌아가기

해설

서로 다른 두 정점 u,vu,vu,v에 대하여

δ(u,v)=max⁡(1,dT(u,v))\delta(u,v)=\max(1,d_T(u,v))δ(u,v)=max(1,dT​(u,v))

라고 하자. δ\deltaδ는 삼각 부등식을 만족한다.

좌표가 증가하는 순서대로 정점을 p1,p2,…,pNp_1,p_2,\ldots,p_Np1​,p2​,…,pN​이라 하자. 인접한 두 정점의 좌표 차이는 적어도 이므로 배치의 길이는

∑i=1N−1δ(pi,pi+1)\sum_{i=1}^{N-1}\delta(p_i,p_{i+1})i=1∑N−1​δ(pi​,p

이상이다. 반대로 위 값들을 차례대로 좌표 차이로 사용하면, 삼각 부등식에 의해 모든 두 정점에 대한 조건을 만족한다. 따라서 문제는 거리 δ\deltaδ에서 가장 짧은 해밀턴 경로의 길이를 구하는 것과 같다.

가중치가 000인 간선으로 연결된 정점들을 하나의 컴포넌트로 합치자. 합친 트리를 HHH라고 하자. HHH의 모든 간선 가중치는 111이다. HHH의 정점 vvv가 나타내는 원래 정점의 수를 c, 에서의 차수를 라고 하자.

서로 다른 컴포넌트에 속한 두 원래 정점 사이의 δ\deltaδ 거리는 HHH에서의 거리이고, 같은 컴포넌트에 속한 두 원래 정점 사이의 거리는 111이다.

원래 정점들의 순서를 따라 서로 다른 컴포넌트 사이의 이동을 HHH 위의 경로로 펼치면, HHH의 모든 정점을 방문하는 하나의 보행을 얻는다. 시작 컴포넌트를 sss, 마지막 컴포넌트를 ttt라 하자. sss와 ttt 사이의 경로를 PP라고 하면, 위의 간선은 적어도 한 번, 나머지 간선은 적어도 두 번 지나야 한다.

한 간선을 최소 횟수보다 두 번 더 지나는 것은 이동 길이를 222 늘리고, 양 끝 컴포넌트에서 사용할 수 있는 방문 횟수를 각각 최대 한 번 늘린다. 같은 컴포넌트의 남은 정점을 연속으로 배치하는 비용도 정점 하나당 111이므로, 간선을 추가로 왕복해도 답은 감소하지 않는다. 따라서 PPP의 간선은 한 번, 나머지 간선은 두 번 지나는 보행만 고려하면 충분하다.

이 보행에서 컴포넌트 vvv의 방문 횟수는 다음과 같다.

  • vvv가 PPP의 내부 정점이면 deg⁡(v)−1\deg(v)-1deg(v)−1번이다.
  • 그 외에는 deg⁡(v)\deg(v)deg(v)번이다.

한 번 방문할 때 그 컴포넌트의 원래 정점을 하나 배치할 수 있다. 방문 횟수보다 원래 정점이 더 많다면, 남은 정점 하나마다 비용 111이 추가된다.

다음을 정의하자.

B=2(∣V(H)∣−1)+∑v∈V(H)max⁡(0,cv−deg⁡(v)).B=2(|V(H)|-1)+\sum_{v\in V(H)}\max(0,c_v-\deg(v)).B=2(∣V(H)∣−1)+v

PPP의 내부 정점이 되면서 추가 비용이 111 생기는 것은 cv≥deg⁡(v)c_v\geq\deg(v)cv​≥deg(v)인 정점뿐이다. 이러한 정점을 표시된 정점이라고 하자. 경로 PP를 선택했을 때의 답은

B−(∣E(P)∣−#{P의 표시된 내부 정점})B-\left(|E(P)|-\#\{P\text{의 표시된 내부 정점}\}\right)B−(∣E(P)∣−#{P의 표시된 내부 정점})

이다. 따라서 괄호 안의 값을 최대로 만들면 된다.

트리를 임의의 정점에 루팅하자. downvdown_vdownv​를 vvv를 한쪽 끝점으로 하고 vvv의 서브트리 안으로 내려가는 경로의 최대 괄호 값이라고 하자. 자식 uuu 방향으로 내려가는 경로의 값은

1+max⁡(0,downu−[u가 표시됨])1+\max(0,down_u-[u\text{가 표시됨}])1+max(0,downu​−[u가 표시됨])

이다. 각 정점에서 가장 큰 두 값을 관리하면, vvv를 끝점으로 하는 경로와 vvv를 내부 정점으로 하는 경로를 모두 확인할 수 있다. 재귀 깊이 문제를 피하기 위해 정점 순서를 먼저 만든 뒤 역순으로 계산한다.

HHH가 정점 하나뿐이라면 모든 원래 정점 사이의 거리가 111이므로 답은 N−1N-1N−1이다.

DSU와 트리 DP를 사용한다. 시간 복잡도는 O(Nα(N))O(N\alpha(N))O(Nα(N)), 공간 복잡도는 O(N)O(N)O(N)이다.

서브태스크 1에서는 트리의 지름을 DDD라 할 때 답이 2(N−1)−D2(N-1)-D2(N−1)−D이다. 서브태스크 2에서는 압축한 트리의 각 정점을 시작점으로 삼아 모든 경로의 이득을 직접 계산하는 O(N2)O(N^2)O(N2) 풀이를 사용할 수 있다.

δ(pi,pi+1)\delta(p_i,p_{i+1})
δ(pi​,pi+1​)
i+1​
)
vc_v
cv​
HHH
deg⁡(v)\deg(v)deg(v)
P
PPP
∈
V
(
H
)
∑
​
max
(
0
,
cv​
−
deg(v)).
P