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

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

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

Courier Lulu

返回题目

题解

각 다리를 상자의 크기 ccc가 큰 순서대로 처리한다.

dp[x]dp[x]dp[x]를 지금까지 처리한, 즉 현재 다리보다 큰 크기의 상자만 사용해서 xxx번 섬에 도착했을 때 회수할 수 있는 상자 개수의 최댓값이라고 하자.

현재 처리하는 다리가 uuu와 vvv를 잇고 상자 크기가 ccc라고 하자. 이 다리를 마지막에 지나려면, 그 전에 회수한 모든 상자의 크기는 ccc보다 커야 한다. 그러므로 현재 다리를 지나기 전 상태는 이미 dpdpdp에 반영되어 있다.

가능한 전이는 두 가지이다.

  • uuu번 섬에 도착해 있다가 이 다리를 지나 vvv번 섬으로 간다.
  • vvv번 섬에 도착해 있다가 이 다리를 지나 uuu번 섬으로 간다.

따라서 다음과 같이 갱신한다.

dp[v]←max⁡(dp[v],dp[u]+1),dp[u]←max⁡(dp[u],dp[v]+1).\begin{aligned} dp[v] &\leftarrow \max(dp[v], dp[u] + 1),\\ dp[u] &\leftarrow \max(dp[u], dp[v] + 1). \end{aligned}dp[v]dp[

단, 같은 다리를 양방향으로 동시에 사용하는 것을 막기 위해 두 값은 갱신 전의 dp[u]dp[u]dp[u], dp[v]dp[v]dp[v]를 저장해 둔 뒤 동시에 갱신해야 한다.

모든 상자의 크기가 서로 다르므로 같은 크기의 다리들을 따로 묶어 처리할 필요는 없다.

각 다리는 정확히 한 번 처리되고, 정렬에 O(Mlog⁡M)O(M \log M)O(MlogM) 시간이 걸린다. 전체 시간 복잡도는 O(Mlog⁡M)O(M \log M)O(MlogM), 메모리 복잡도는 O(N+M)O(N+M)O(N+이다.

u
]
​
←max(dp[v],dp[u]+1),←max(dp[u],dp[v]+1).​
M
)