DOJ logoDOJ
题目
最近添加的题目收藏的题目Workbooks
分类DLC比赛小组团队讨论区
排名
解题数量排行榜连续解题排名DOJ Power 排行榜
评测状态
征题登录注册
DOJ logoDOJ

支持 OI 子任务计分、Elo 等级分和 Discord 账号绑定的社区在线评测系统。

题目
题目列表分类
社区
比赛排名讨论区公告举办外部比赛指南
账号
登录注册评测状态
政策
服务条款DLC 使用规则隐私政策API 文档语言运行环境比赛排名奖励评级与表现
© 2026 DOJ
保留所有权利
题解

All Falls Down

返回题目

题解

각 정점 vvv에 정수 r(v)r(v)r(v)를 다음과 같이 정의한다.

  • vvv가 잎이면 r(v)=0r(v)=0r(v)=0이다.
  • r(c)r(c)r(c)가 짝수인 자식 ccc가 있다면, 그 값의 최솟값에 111을 더한다.
  • 그렇지 않다면, 모든 자식의 r(c)r(c)r(c) 중 최댓값에 111을 더한다.

이 값은 자식의 값을 모두 구한 뒤 아래에서 위로 계산할 수 있다. r(v)r(v)r(v)가 양의 짝수이면 모든 자식의 값은 홀수이며 그 최댓값은 r(v)−1r(v)-1r(v)−1이다. r(v)r(v)r(v)가 홀수이면 값이 r(v)−1r(v)-1인 짝수 자식이 존재하고, 모든 짝수 자식의 값은 이상이다.

현재 말이 u,vu,vu,v에 있고 턴을 진행할 사람이 패배하는 조건은 min⁡(r(u),r(v))\min(r(u),r(v))min(r(u),r(v))가 짝수인 것이다. 말이 자식으로 내려갈 때마다 이 명제를 귀납적으로 증명할 수 있다.

min⁡(r(u),r(v))=k\min(r(u),r(v))=kmin(r(u),r(v))=k가 짝수라고 하자. k=0k=0k=0이면 이동할 수 없는 말이 있다. k>0k>0k>이면 값이 인 말의 모든 자식은 값이 보다 작은 홀수이다. 다른 말의 자식 값이 짝수라면 그 값은 이상이고, 홀수라면 두 자식 값의 최솟값은 여전히 홀수이다. 따라서 모든 이동은 상대가 이기는 상태로 간다.

반대로 kkk가 홀수라면, 값이 kkk인 말은 값이 k−1k-1k−1인 짝수 자식으로 이동할 수 있다. 다른 말의 값이 홀수라면 값이 k−1k-1k−1 이상인 짝수 자식을 고를 수 있다. 다른 말의 값이 짝수라면 값이 kkk 이상인 홀수 자식을 고를 수 있다. 따라서 두 자식 값의 최솟값이 짝수인 상태로 이동할 수 있다.

Alice가 쌍을 고른 직후 Bob이 먼저 이동하므로, 구하는 쌍은 min⁡(r(u),r(v))\min(r(u),r(v))min(r(u),r(v))가 짝수인 쌍이다. 각 rrr값의 빈도를 세고 큰 값부터 내려오며, 현재 값이 짝수일 때 같은 값을 가진 정점 쌍과 더 큰 값을 가진 정점과의 쌍을 더한다. 답은 646464비트 정수에 저장한다.

한 케이스의 시간 복잡도와 공간 복잡도는 모두 O(N)O(N)O(N)이다.

Solution written by GPT6

r
(
v
)
−
1
r(v)−1r(v)-1r(v)−1
0
kkk
kkk
kkk