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

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

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

Don't Mess with the Moles

返回题目

题解

지점 www의 두더지가 거리만으로 지점 uuu를 유일하게 알아낼 때, www가 uuu를 식별한다고 하자. 트리가 경로라면 끝점 하나에서 모든 거리가 다르므로 두더지 한 마리면 충분하다. 이하에서는 경로가 아닌 트리를 생각한다.

리프의 집합을 FFF, 어떤 리프에서도 식별되지 않는 지점의 집합을 BBB라 하면 F∪BF\cup BF∪B에 배치하는 것이 최적이다.

이제 BBB를 구하자. 간선 xyxyxy를 끊은 뒤 xxx 쪽 성분을 Cx→yC_{x\to y}Cx→y​라 하고, 그 높이와 지름을

hx→y=max⁡v∈Cx→yd(x,v),Dx→y=diam⁡(Cx→y)h_{x\to y}=\max_{v\in C_{x\to y}} d(x,v),\qquad D_{x\to y}=\operatorname{diam}(C_{x\to y})hx→y​=v∈

로 둔다. 비리프 uuu가 어떤 리프에서 식별될 필요충분조건은, 어떤 이웃 aaa에 대해 ha→u=Da→uh_{a\to u}=D_{a\to u}ha→u​=D인 것이다.

이 방향별 값은 리루팅 DP로 계산한다. x→yx\to yx→y를 구할 때 z≠yz\neq yz=y인 이웃들의 가지 높이 1+hz→x1+h_{z\to x}1+h와 두 개의 중 큰 두 값을 라 하면

hx→y=t1,Dx→y=max⁡(t1+t2,max⁡z≠yDz→x,0).h_{x\to y}=t_1,\qquad D_{x\to y}=\max\left(t_1+t_2,\max_{z\neq y}D_{z\to x},0\right).hx→y​=t1

자식에서 부모, 부모에서 자식 순으로 계산하되, 가지 높이 상위 333개와 지름 상위 222개를 보관하면 이웃 하나를 제외한 값도 상수 시간에 구한다. 모든 리프와 위 조건을 만족하는 이웃이 없는 비리프에 배치한다. 시간과 공간 복잡도는 O(N)O(N)O(N)이다.

증명

w≠uw\neq uw=u가 uuu를 식별한다고 하자. uuu에서 www 방향의 이웃을 aa, 간선 를 끊었을 때 쪽 성분을 라 하면

C
x→y​
max
​
d
(
x
,
v
)
,
Dx→y​
=
diam(Cx→y​)
a→u
​
z→x​
000
t1,t2t_1,t_2t1​,t2​
​
,
Dx→y​
=
max(t1​+t2​,z=ymax​Dz→x​,0).
a
uauaua
aaa
CCC
w가 u를 식별한다  ⟺  max⁡x∈Cd(w,x)=d(w,a).w\text{가 }u\text{를 식별한다} \iff \max_{x\in C}d(w,x)=d(w,a).w가 u를 식별한다⟺x∈Cmax​d(w,x)=d(w,a).

CCC 안에 더 먼 지점이 있으면 그 경로에서 uuu와 같은 거리의 지점을 만나기 때문이다. 따라서 aaa는 CCC의 지름 끝점이고, 반대쪽 끝점인 원래 트리의 리프도 uuu를 식별한다. 반대로 aaa가 지름 끝점이면 반대쪽 끝점에서 uuu를 식별할 수 있다. 이는 ha→u=Da→uh_{a\to u}=D_{a\to u}ha→u​=Da→u​라는 판정 조건을 준다. 또한 BBB의 지점을 식별할 수 있는 두더지는 그 지점에 놓인 두더지뿐이므로, 반드시 직접 배치해야 한다.

각 리프에서 첫 분기점 직전까지의 경로도 적어도 한 마리를 요구한다. 그 경로 밖의 두더지는 분기점 바로 앞의 지점과 다른 가지의 지점을 구별할 수 없기 때문이다. 이 경로들은 서로 겹치지 않고, 해당 리프가 경로의 모든 지점을 식별하므로 BBB와도 겹치지 않는다. 따라서 최소 ∣F∣+∣B∣|F|+|B|∣F∣+∣B∣마리가 필요하며 F∪BF\cup BF∪B가 이를 달성한다.

리루팅 점화식에서 성분의 지름은 한 가지 안에 있거나 xxx를 지나 두 가지를 잇는다. 따라서 가지들의 지름과 가장 긴 두 가지의 높이 합 중 최댓값을 취하면 된다.