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

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

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

슉슉 잇기

문제로 돌아가기

해설

트리의 루트를 111로 정하고, 자식부터 DP를 계산한다. CvC_vCv​는 vvv의 서브트리를 완전히 덮는 최소 경로 수이다. Ov(c)O_v(c)Ov​(c)는 vvv를 한쪽 끝으로 하고 반대쪽 끝의 값이 ccc인 경로 하나를 부모 방향으로 연장할 수 있도록 남겼을 때, 나머지를 덮는 최소 경로 수이다. 이 열린 경로 자체는 세지 않는다.

자식 uuu에 대해 Du(c)=Cu−Ou(c)D_u(c)=C_u-O_u(c)Du​(c)=Cu​−를 정의하고, 라 하자. 존재하지 않는 상태는 후보에서 제외한다. 다음과 같이 계산한다.

gv=max⁡(0, max⁡uDu(Av), max⁡u≠w, c(Du(c)+Dw(c))),Cv=Bv+1−gv.g_v=\max\left(0,\ \max_u D_u(A_v),\ \max_{u\ne w,\,c}\bigl(D_u(c)+D_w(c)\bigr)\right), \qquad C_v=B_v+1-g_v.gv​=

또한 Mv(c)M_v(c)Mv​(c)를 자식들의 Du(c)D_u(c)Du​(c) 중 최댓값으로 두되, c=Avc=A_v이면 도 후보에 넣는다. 그러면

Dv(c)=1−gv+Mv(c)D_v(c)=1-g_v+M_v(c)Dv​(c)=1−gv​+

이다. 이 값은 음수일 수도 있으므로 그대로 유지한다.

각 DvD_vDv​를 값 ccc를 키로 하는 맵에 저장한다. vvv에서는 임시 맵 {Av:0}\{A_v:0\}{A으로 시작해 자식 맵을 하나씩 합친다. 합치기 전에 공통 키의 두 값의 합으로 를 갱신하고, 합칠 때는 키마다 최댓값만 남긴다. 이 순서를 지켜야 같은 자식의 상태 두 개를 연결하지 않는다. 병합이 끝나면 맵은 를 나타내므로 모든 값에 를 더한다. 공통 덧셈은 별도의 오프셋으로 관리한다.

항상 작은 맵을 큰 맵으로 옮기고 균형 이진 검색 트리를 사용하면, 한 케이스의 시간 복잡도는 O(Nlog⁡2N)O(N\log^2 N)O(Nlog2N), 공간 복잡도는 O(N)O(N)O(N)이다. 정답은 C1C_1C이다.

증명

vvv가 속한 완성된 경로는 자식 방향 간선을 000, 111, 222개 사용한다. 각각 vvv만 남기거나, 끝값이 AvA_vA인 열린 경로를 닫거나, 끝값이 같은 두 자식의 열린 경로를 연결한다. 필요한 경로 수는 각각 , , 이므로 의 점화식을 얻는다.

Ou​
(
c
)
Bv=∑uCuB_v=\sum_u C_uBv​=∑u​Cu​
max
(0, umax​Du​(Av​), u=w,cmax​(Du​(c)+Dw​(c)))
,
Cv​
=
Bv​+
1−
gv​.
c=
Av​
000
Mv​
(
c
)
v
​
:
0}
gvg_vgv​
MvM_vMv​
1−gv1-g_v1−gv​
1
​
v​
Bv+1B_v+1Bv​+1
Bv+1−Du(Av)B_v+1-D_u(A_v)Bv​+1−Du​(Av​)
Bv+1−Du(c)−Dw(c)B_v+1-D_u(c)-D_w(c)Bv​+1−Du​(c)−Dw​(c)
CvC_vCv​

vvv를 열린 경로의 끝으로 남길 때는 자식을 최대 하나만 사용한다. 따라서 Ov(c)=Bv−Mv(c)O_v(c)=B_v-M_v(c)Ov​(c)=Bv​−Mv​(c)이고, 이를 Dv(c)=Cv−Ov(c)D_v(c)=C_v-O_v(c)Dv​(c)=Cv​−O에 대입하면 위 식이 나온다. 모든 경우가 실제 경로 덮개로 만들어지므로 자식부터 계산한 DP는 최적이다.

병합한 맵에서 키마다 최댓값만 남겨도 새 자식과 연결할 최선의 후보를 잃지 않는다. 이미 처리한 자식 두 개의 최적 조합은 gvg_vgv​에 기록되어 있다.

작은 맵의 크기를 sss라 하자. 중복으로 절반 이상이 사라지면 병합 비용을 사라지는 항목에 배분한다. 그렇지 않으면 절반 이상이 살아남고 새 맵의 크기가 적어도 3s/23s/23s/2이므로, 비용을 그 항목들에 배분한다. 항목이 살아 있는 동안 소속 맵의 크기는 줄지 않으며, 처음 만드는 항목은 정점당 하나이다. 따라서 각 항목이 부담하는 비용은 총 O(log⁡N)O(\log N)O(logN)이고 전체 항목 방문 수는 O(Nlog⁡N)O(N\log N)O(NlogN)이다.

v
​
(
c
)