DOJ logoDOJ
問題
最近追加された問題保存した問題
カテゴリDLCコンテストグループチーム掲示板
ランキング
正解数ランキングストリークランキングDOJ Powerランキング
提出状況
問題募集ログイン新規登録
DOJ logoDOJ

OI形式のサブタスク採点、Eloレーティング、Discord認証を備えたオンラインジャッジです。

問題
問題一覧カテゴリ
コミュニティ
コンテストランキング掲示板お知らせ外部のコンテストを開催するガイド
アカウント
ログイン新規登録ジャッジ状態
ポリシー
利用規約DLCの利用規則プライバシーAPI 文書言語ランタイムコンテストの順位報酬レーティングとパフォーマンス
© 2026 DOJ
All rights reserved
解説

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