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

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

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

너희는 두더지 함부로 만지지 마라

문제로 돌아가기

해설

지점 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를 지나 두 가지를 잇는다. 따라서 가지들의 지름과 가장 긴 두 가지의 높이 합 중 최댓값을 취하면 된다.