BOJ 6297 Intervals

BOJ 6297 Intervals

문제 링크:

문제 내용

정수의 집합 ZZ에 대한 nn개의 요구조건이 (ai,bi,ci)(a_i, b_i, c_i)의 형태로 주어집니다. 이는 다음을 의미합니다.

  • ZZ에 속한 정수 중에서 aia_i 이상 bib_i 이하인 것이 cic_i개 이상이다.

이를 충족하는 ZZ 중에서 크기가 가장 작은 것의 크기를 출력하세요.

입력

첫 줄에는 정수 nn이 주어집니다. (1n50  0001 \le n \le 50\;000)

다음 nn줄에는 각각 aia_i, bib_i, cic_i가 주어집니다. (0aibi50  0000 \le a_i \le b_i \le 50\;000, 1cibiai+11 \le c_i \le b_i - a_i + 1)

출력

문제의 정답을 출력합니다.

문제 풀이

스포일러

이 문제는 가능한 한 뒤쪽의 수를 선택하는 그리디로 풀 수 있습니다.

aia_i, bib_i, cic_i가 있으면 반드시 선택해야 하는 가장 작은 수는 k=bici+1k = b_i - c_i + 1이 되며, 이들 중 가장 작은 것을 ZZ에 넣는 행동을 반복하면 됩니다. 이러한 행동을 하고 나면, kk를 포함하는 모든 구간의 cic_i를 1 감소, 다르게 생각하면 그 구간의 최소 선택지를 1 증가시켜야 하며, 더이상 고려할 필요가 없는 구간은 제외하여야 합니다.

이는 구간 덧셈 업데이트, 구간 최솟값 쿼리를 수행하는 레이지 세그먼트 트리를 사용하여 관리할 수 있습니다. 먼저 모든 구간들을 aia_i의 증가순으로 정렬하면 업데이트를 하나의 구간 업데이트로 만들 수 있습니다. 그리고 제외할 구간은 최소 힙을 사용하여 관리할 수 있는데, 구간이 추가될 때 언제 구간을 제거하면 되는지를 가지고 힙에 추가하고, 각 수가 선택될 때마다 횟수가 모두 소진된 구간들을 모두 제거해주면 됩니다.

Last updated on