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

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

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

Merging Intervals

返回题目

题解

먼저 어떤 구간이 다른 구간에 완전히 포함되어 있다고 하자. 포함하는 구간과 임의의 다른 구간을 고른 합집합은, 포함되는 구간과 같은 다른 구간을 고른 합집합보다 작지 않다. 따라서 다른 구간에 포함되는 구간은 최적의 답을 찾을 때 제거해도 된다.

구간을 lll의 오름차순, lll이 같다면 rrr의 내림차순으로 정렬한다. 왼쪽부터 보면서 지금까지 본 rrr의 최댓값보다 rrr이 크지 않은 구간을 제거한다. 남은 구간을

[l1,r1],[l2,r2],⋯ ,[lM,rM][l_1,r_1],[l_2,r_2],\cdots,[l_M,r_M][l1​,r1​],[l

이라 하면

l1<l2<⋯<lM,r1<r2<⋯<rMl_1<l_2<\cdots<l_M,\qquad r_1<r_2<\cdots<r_Ml1​<l2​<⋯<

이 성립한다.

원래 구간 중 가장 긴 구간의 길이를 정답의 초기값으로 둔다. 다른 모든 구간이 하나의 구간 안에 포함되는 경우에도 이 값이 정답이 된다.

이제 남은 구간에서 오른쪽 구간 jjj를 고정하자. ri<ljr_i<l_jri​<lj​를 만족하는 가장 뒤쪽 경계와 ri≥ljr_i\geq l_j를 만족하는 가장 앞쪽 경계를 투 포인터로 관리한다.

ri<ljr_i<l_jri​<lj​인 구간 iii는 jjj번 구간과 서로 겹치지 않는다. 따라서 합집합 길이는

(ri−li)+(rj−lj)(r_i-l_i)+(r_j-l_j)(ri​−li​)+(r

이다. 앞쪽 구간들의 길이 최댓값을 전처리하면 이 경우의 최댓값을 바로 구할 수 있다.

반대로 ri≥ljr_i\geq l_jri​≥lj​인 구간들은 jjj번 구간과 겹치거나 한 점에서 만난다. 남은 구간들의 오른쪽 끝점은 엄격히 증가하므로 ri<rjr_i<r_j이고, 합집합은

[li,rj][l_i,r_j][li​,rj​]

가 된다. 따라서 가능한 iii 중 lil_ili​가 가장 작은, 즉 가장 앞쪽 구간을 고르는 것이 최적이다.

정렬에 O(Nlog⁡N)O(N\log N)O(NlogN), 이후 전처리와 투 포인터에 O(N)O(N)O(N)이 걸리므로 전체 시간 복잡도는 O(Nlog⁡N)O(N\log N)O(NlogN)이다.

모든 구간은 [0,109][0,10^9][0,109] 안에 있으므로 두 구간의 합집합도 이 범위를 벗어나지 않는다. 따라서 정답은 항상 10910^9109 이하이며 부호 있는 646464비트 정수 범위에 들어간다.

Solution written by GPT5.6

2
​
,
r2​
]
,
⋯
,
[
lM​
,
rM​
]
lM​
,
r1​
<
r2​<
⋯<
rM​
ri​≥
lj​
j
​
−
lj​)
ri​<
rj​