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

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

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

라운드 로빈 트리

문제로 돌아가기

해설

정점 vvv를 루트로 하는 서브트리에 공을 kkk개 넣었을 때 얻을 수 있는 최댓값을 Fv(k)F_v(k)Fv​(k)라 하자.

먼저 자식이 하나인 정점을 처리한다. 정점 vvv의 자식이 uuu 하나뿐이라면 모든 공이 반드시 uuu로 이동하므로

Fv(k)=Fu(k)F_v(k)=F_u(k)Fv​(k)=Fu​(k)

이다. 따라서 자식이 하나인 정점들을 모두 압축해도 공의 분배와 점수는 변하지 않는다. 루트부터 자식이 하나인 경로가 이어지는 경우에도 같은 방식으로 압축한다. 압축된 트리의 모든 정점은 리프이거나 자식이 적어도 두 개이다.

리프 vvv에서는 모든 공이 그 리프에서 멈추므로

Fv(k)=kCvF_v(k)=kC_vFv​(k)=kCv​

이다.

이제 자식이 ddd개인 정점 vvv를 생각하자. k=qd+rk=qd+rk=qd+r이고 0≤r<d0\le r<d0≤r라 하자. 자식 순서와 관계없이 모든 자식은 공을 개씩 받고, 순서의 앞 개 자식만 공을 하나 더 받는다.

자식 uuu가 추가 공을 하나 받을 때의 이득은

Du(q)=Fu(q+1)−Fu(q)D_u(q)=F_u(q+1)-F_u(q)Du​(q)=Fu​(q+1)

이다. 앞 rrr개 위치에는 어떤 rrr개의 자식도 놓을 수 있으므로, Du(q)D_u(q)Du​(q)가 큰 자식 rrr개를 고르는 것이 최적이다. 따라서

Fv(k)=∑uFu(q)+Du(q) 중 큰 값 r개의 합F_v(k)=\sum_{u}F_u(q)+\text{$D_u(q)$ 중 큰 값 $r$개의 합}Fv​(k)=u∑​

을 얻는다.

같은 qqq에 대해 k=qd,qd+1,⋯ ,qd+d−1k=qd,qd+1,\cdots,qd+d-1k=qd,qd+1,⋯,qd+d−을 한꺼번에 계산할 수 있다. 모든 자식의 를 내림차순으로 정렬하고 누적합을 만들면 이 구간의 상태를 모두 계산할 수 있다.

모든 정점에서 000부터 XXX까지 계산하면 여전히 너무 느리다. 정점 vvv에 실제로 필요할 수 있는 공 개수의 최댓값을 KvK_vKv​라 하자. 압축된 루트에서는 Kroot=XK_{root}=X이다. 자식 수가 인 정점 의 자식 는 최대

Ku=⌈Kvd⌉K_u=\left\lceil\frac{K_v}{d}\right\rceilKu​=⌈dKv​

개의 공만 받을 수 있다. 따라서 Fu(0),Fu(1),⋯ ,Fu(Ku)F_u(0),F_u(1),\cdots,F_u(K_u)Fu​(0),Fu​(1),⋯,F만 계산하면 충분하다.

상태 수를 증명하자. Ev=Kv−1E_v=K_v-1Ev​=Kv​−1이라 두면 자식 uuu에 대해

Eu=⌊Evd⌋E_u=\left\lfloor\frac{E_v}{d}\right\rfloorEu​=⌊dEv​

이다. 압축된 트리에서는 d≥2d\ge2d≥2이므로 양수인 EvE_vEv​는 한 단계 내려갈 때마다 적어도 절반이 된다. 또한 한 정점의 자식들에 대한 EEE의 합은 부모의 EEE를 넘지 않는다. 따라서 같은 깊이의 모든 의 합은 이하이고, 양수인 가 존재할 수 있는 깊이는 개뿐이다. 인 정점은 정점마다 상수 개의 상태만 추가한다.

결과적으로 전체 DP 상태 수는

O(N+Xlog⁡X)O(N+X\log X)O(N+XlogX)

이다. 각 qqq마다 자식들의 이득을 정렬하므로 전체 시간 복잡도는

O((N+Xlog⁡X)log⁡N)O((N+X\log X)\log N)O((N+XlogX)logN)

이고, 메모리 복잡도는

O(N+Xlog⁡X)O(N+X\log X)O(N+XlogX)

이다.

점수는 음수일 수 있고 절댓값이 2⋅10142\cdot10^{14}2⋅1014까지 커질 수 있으므로 64비트 정수를 사용해야 한다.

Solution written by GPT5.6

<
d
qqq
rrr
−
Fu​(q)
F
u​
(
q
)
+
Du​(q) 중 큰 값 r개의 합
1
Du(q)D_u(q)Du​(q)
Kroot​=
X
ddd
vvv
uuu
​
⌉
u​
(
Ku​
)
​
⌋
EvE_v
Ev​
X−1X-1X−1
EvE_vEv​
O(log⁡X)O(\log X)O(logX)
Ev=0E_v=0Ev​=0