DOJ logoDOJ
题目
最近添加的题目收藏的题目Workbooks
分类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