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

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

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

지가르데 경곽폼

문제로 돌아가기

해설

  1. 코어 경로 위의 그룹으로 축약하기

코어 AAA와 코어 ZZZ 사이의 경로를 순서대로 V1,V2,…,VMV_1,V_2,\ldots,V_MV1​,V2​,…,VM​이라고 하자. 각 정점을 자신과 가장 가까운 코어 경로 정점에 배속하고, ViV_iVi​에 배속된 정점의 수를 wiw_iwi​라고 정의한다. 경로 위의 정점 ViV_iVi​ 자신도 이 그룹에 포함되므로 wiw_iwi​는 항상 1 이상이다.

끊을 수 있는 간선은 코어 경로 위의 간선뿐이다. 따라서 같은 그룹에 속한 정점들은 항상 같은 연결 요소에 남고, 하나의 연결 요소는 연속한 그룹들로 이루어진다. 반대로 MMM개의 그룹을 정확히 KKK개의 비어 있지 않은 연속 구간으로 나누면, 구간 사이의 K−1K-1K−1개 간선을 끊어 그 분할을 얻을 수 있다.

같은 그룹에 속한 두 정점의 에너지는 0이다. 서로 다른 iii, jjj번 그룹 사이에서는 정점 쌍이 wiwjw_iw_jwi​wj​개이고, 각 쌍의 에너지는 ∣이다. 따라서 그룹 부터 까지를 하나의 부분으로 묶는 비용은 다음과 같다.

C(l,r)=∑l≤i<j≤rwiwj(j−i).C(l,r)=\sum_{l\le i<j\le r}w_iw_j(j-i).C(l,r)=l≤i<j≤r∑​w

원래 트리에서 그룹을 구할 때는 AAA를 루트로 잡아 부모와 부모가 먼저 등장하는 순회 순서를 만든다. ZZZ에서 부모를 따라가면 코어 경로를 얻는다. 경로 정점들의 그룹 번호를 먼저 표시한 다음, 순회 순서대로 경로 밖 정점에 부모의 그룹 번호를 물려주면 된다. 이 과정은 O(N)O(N)O(N) 시간이다.

  1. 구간 비용을 O(1)O(1)O(1)에 계산하기

다음 누적합을 정의하고, 인덱스 0의 값은 모두 0으로 둔다.

Wi=∑j=1iwj,Pi=∑j=1ijwj,Hi=C(1,i).W_i=\sum_{j=1}^{i}w_j,\qquad P_i=\sum_{j=1}^{i}j w_j,\qquad H_i=C(1,i).Wi​=j=1∑

새 그룹 iii와 이전 그룹들 사이의 비용만 더하면 되므로 HiH_iHi​는 다음 식으로 계산할 수 있다.

Hi=Hi−1+wi(iWi−1−Pi−1).H_i=H_{i-1}+w_i(iW_{i-1}-P_{i-1}).Hi​=Hi−1​+

t=l−1t=l-1t=l−1이라 하자. Hr−HtH_r-H_tHr​−Ht에는 구간 내부의 비용뿐 아니라 와 사이의 비용도 포함된다. 뒤의 비용을 빼면 다음 식을 얻는다.

C(l,r)=Hr−Ht−Wt(Pr−Pt)+Pt(Wr−Wt).C(l,r)=H_r-H_t-W_t(P_r-P_t)+P_t(W_r-W_t).C(l,r)=Hr​−H

세 누적합을 O(M)O(M)O(M)에 구한 뒤에는 구간 비용을 O(1)O(1)O(1)에 계산할 수 있다.

  1. 동적 계획법

DPk[r]DP_k[r]DPk​[r]를 처음 rrr개의 그룹을 정확히 kkk개의 비어 있지 않은 연속 구간으로 나누는 최소 비용이라고 하자. 마지막 구간이 [l,r][l,r][l인 경우를 모두 고려하면 다음 점화식을 얻는다.

DPk[r]=min⁡k≤l≤r{DPk−1[l−1]+C(l,r)}.DP_k[r]=\min_{k\le l\le r}\{DP_{k-1}[l-1]+C(l,r)\}.DPk​[r]=k≤l

초기값은 DP0[0]=0DP_0[0]=0DP0​[0]=0이며, 만들 수 없는 상태는 무한대로 둔다. 최종 답은 DPK[M]DP_K[M]DPK​[M이다. 이 점화식을 그대로 계산하면 시간이 필요하다.

  1. Monge 성질과 분할 정복 최적화

a≤b≤c≤da\le b\le c\le da≤b≤c≤d일 때 다음 차이를 전개하자.

C(a,d)+C(b,c)−C(a,c)−C(b,d)=∑i=ab−1∑j=c+1dwiwj(j−i)≥0.C(a,d)+C(b,c)-C(a,c)-C(b,d)=\sum_{i=a}^{b-1}\sum_{j=c+1}^{d}w_iw_j(j-i)\ge0.C(a,d)+C(b,c)−C

즉, 구간 비용은 Monge 부등식을 만족한다. 후보 lll마다 DPk−1[l−1]DP_{k-1}[l-1]DPk−1​[l−1]을 더해도 이 부등식은 유지된다. 이 때문에 rrr이 증가할 때 최적인 마지막 구간의 시작점이 왼쪽으로 이동하지 않는다. 동률에서는 가장 작은 시작점을 고르면 이러한 단조성을 일관되게 유지할 수 있다.

한 DPDPDP 층을 계산할 때 rrr의 중간값 midmidmid를 먼저 처리한다. 가능한 최적 시작점의 범위가 [L,R][L,R][L,R]이라면 lll을 부터 까지 검사하여 최적인 위치 를 찾는다. 이후 왼쪽 절반에서는 후보 범위를 로, 오른쪽 절반에서는 로 좁혀 재귀적으로 계산한다. 번째 층의 처음 호출은 의 범위 , 후보 범위 에서 시작한다. 이전 층의 불가능한 상태는 후보에서 제외한다.

재귀 깊이는 O(log⁡M)O(\log M)O(logM)이고 한 깊이에서 검사하는 후보 수의 합이 O(M)O(M)O(M)이므로, 한 층을 O(Mlog⁡M)O(M\log M)O(MlogM)에 계산할 수 있다.

  1. 복잡도와 구현 시 주의할 점

전체 시간복잡도는 O(N+KMlog⁡M)O(N+KM\log M)O(N+KMlogM), 공간복잡도는 O(N)O(N)O(N)이다. DPDPDP는 이전 층과 현재 층만 저장하면 된다.

정점 쌍은 N(N−1)/2N(N-1)/2N(N−1)/2개 이하이고 한 쌍의 에너지는 M−1M-1M−1 이하이므로, 전체 에너지는 4×10154\times10^{15}4×10보다 작다. 또한 , 이므로 이다. 비용식에서 이 값들을 더하고 빼는 중간 계산도 64비트 정수 범위에 들어간다. 따라서 , , , , 값과 곱셈의 중간값을 모두 64비트 정수로 처리하면 된다. 가중치가 없는 원래 트리에서도 정답을 32비트 정수에 저장하면 안 된다.

트리가 길이 NNN인 경로일 수 있으므로 그룹을 구하는 트리 순회는 반복형으로 구현하면 깊은 재귀로 인한 스택 문제를 피할 수 있다. 분할 정복 DPDPDP의 재귀 깊이는 O(log⁡M)O(\log M)O(logM)이다.

i−j∣|i-j|
∣i−j∣
lll
rrr
i​
wj​
(
j
−
i).
i
​
wj​
,
Pi​
=
j=1∑i​jwj​,Hi​=
C(1,i).
w
i​
(
i
Wi−1​
−
Pi−1​).
​
[l,r][l,r][l,r]
[1,t][1,t][1,t]
[l,r][l,r][l,r]
t​
−
Wt​(Pr​−
Pt​)+
Pt​(Wr​−
Wt​).
,
r
]
≤
r
min
​
{
D
Pk−1​
[
l
−
1]+
C(l,r)}.
]
O(KM2)O(KM^2)O(KM2)
(
a
,
c
)
−
C(b,d)=
i=a∑b−1​j=c+1∑d​wi​wj​(j−
i)≥
0.
LL
L
min⁡(mid,R)\min(\mathrm{mid},R)min(mid,R)
optoptopt
[L,opt][L,\mathrm{opt}][L,opt]
[opt,R][\mathrm{opt},R][opt,R]
kkk
rrr
[k,M][k,M][k,M]
[k,M][k,M][k,M]
15
Wi≤NW_i\le NWi​≤N
Pi≤NMP_i\le NMPi​≤NM
WiPj≤N2M≤8×1015W_iP_j\le N^2M\le 8\times10^{15}Wi​Pj​≤N2M≤8×1015
www
WWW
PPP
HHH
DPDPDP