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

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

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

구간 합치기

문제로 돌아가기

해설

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

구간을 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​