문제
풀이
Join으로 주어지는 시간들을 $t_i$, $d_i$라 하고 Query로 주어지는 시간을 $t_q$라 합시다.
우리는 $t_i \le t_q$를 만족하는 모든 Join이 끝나는 시간을 찾으면 됩니다.
먼저 정답 ans = 0으로 초기화합니다. 그리고 $t_i$가 작은 것 부터 순서대로 ans = max(t_i + d_i, ans + d_i)를 적용하면 답을 찾을 수 있습니다.
max에서 첫 번째 인자는 ans < t_i라 Join이 겹치지 않아서 밀리지 않은 경우이고, 두 번째 인자는 ans > t_i라 Join들이 겹쳐서 밀린 경우입니다.
이를 Naive하게 계산하면 $O(q)$가 걸리지만 세그먼트 트리를 이용하면 $O(\log 10^6)$에 계산할 수 있습니다.
세그먼트 트리의 노드에 두 가지 값을 관리합니다. 하나는 해당 구간에서 모든 Join이 끝나는 시간, 두 번째는 해당 구간의 $d_i$의 합입니다. 이는 위에서 말한 ans를 계산하는 식과 같은 방식으로 계산할 수 있습니다.
코드
1 | |