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

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

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

택배기사 루루

문제로 돌아가기

해설

각 다리를 상자의 크기 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
)