동기
각 질의가 "어떤 단조 조건이 처음 참이 되는 시점 \(t\)" 를 묻는 형태라 하자. 예컨대 간선이 시간 순으로 추가되며, 질의 \(q\) 는 "두 정점이 처음 연결되는 시점" 또는 "\(k\)번째 물이 마을에 도달하는 작업 번호" 를 묻는다. 질의 하나당 독립적으로 이분 탐색하면 매번 자료구조를 처음부터 시뮬레이션해야 해 \(O(Q\cdot M\log T)\) 로 폭발한다. 병렬 이분 탐색(Parallel Binary Search) 은 모든 질의의 이분 탐색을 같은 라운드에서 동시에 진행해 시뮬레이션을 공유한다.
핵심 통찰
각 질의 \(q\) 는 현재 후보 구간 \([lo_q, hi_q]\) 를 가지고 그 중점 \(mid_q\) 의 답을 알고 싶어 한다. 서로 다른 질의의 \(mid\) 는 다르지만, 시간축을 한 번 처음부터 끝까지 훑으면서 "지금 시각이 \(mid_q\) 인 질의들"의 판정만 그 순간 처리 하면, 한 번의 전체 시뮬레이션으로 모든 질의의 중점 판정을 끝낼 수 있다.
각 라운드:
- 모든 활성 질의의 \(mid_q\) 를 계산하고, 시각별 버킷
check[mid_q]에 질의를 모은다. - 자료구조를 시각 1부터 \(T\)까지 한 번 진행하면서, 시각 \(t\) 에 도달하면
check[t]의 모든 질의를 현재 상태로 판정해 \(lo/hi\) 를 갱신한다. - 구간이 모두 한 점이 될 때까지 \(O(\log T)\) 라운드 반복.
복잡도
라운드가 \(O(\log T)\) 개, 라운드마다 전체 시뮬레이션 비용 \(O((M+Q)\,\alpha)\) (\(\alpha\)=자료구조 연산 비용)이므로 전체
$$ O\big((M+Q)\,\alpha\,\log T\big). $$
질의별로 따로 이분하는 것보다 \(\log T\) 만큼이 아니라 질의 개수만큼 이득이 난다(시뮬레이션 공유).
단조성 조건
판정 함수 \(P_q(t)\) 가 \(t\) 에 대해 단조여야 한다(한 번 참이 되면 계속 참). 보통 "간선/작업을 추가만 한다"는 점에서 단조성이 나온다. 추가만 일어나야 자료구조를 매 라운드 깨끗이 재시작하고 앞에서부터 다시 쌓을 수 있다.
언제 쓰나
| 신호 | 의미 |
|---|---|
| 질의마다 "처음 ~되는 시점" | 단조 판정 → 이분 |
| 판정에 무거운 자료구조(DSU/세그) 필요 | 시뮬레이션 공유 이득 |
| 오프라인 허용 | 모든 질의를 미리 받음 |