시간에 따라 변하는 일차함수
각 원소가 일차함수 \(f_i(t) = a_i\ t + b_i\)이고, 전역 시간 \(t\)가 단조 증가 한다고 하자. 처리할 연산:
- 시간을 \(t \to t'\) (\(t' \ge t\))로 전진.
- 구간 \([l, r]\)의 현재 최솟값(또는 최댓값) 질의.
- 원소의 계수 갱신.
평범한 세그먼트 트리는 한 시점의 최값만 잡는다. 시간이 흐르면 "어느 함수가 최소인지"가 교차점 에서 바뀐다. 이를 amortize하는 것이 키네틱 세그먼트 트리(Kinetic Segment Tree, KST) 다.
certificate(증명서)와 melt time
각 내부 노드는 "내 서브트리의 최솟값은 자식 \(c\)가 들고 있다"는 사실을 저장한다. 이 사실이 깨지는 시점을 melt time 이라 부른다: 현재 최소인 함수와 다른 함수가 교차해 추월하는 시각.
노드의 melt time은 "현재 챔피언과 도전자 직선의 교점 시각" 중 가장 이른 것.
$$ t_{\text{melt}} = \min t' > t \ :\ f_{\text{loser}}(t') = f_{\text{winner}}(t'). $$
시간 전진: heaten
시간을 \(t'\)로 올릴 때, \(t_{\text{melt}} \le t'\)인 노드만 갱신하면 된다. 트리 전역의 melt time 최솟값을 (예: 별도 우선순위로) 추적하고, \(t'\)에 도달할 때까지 "녹은" 노드만 자식 정보로 다시 pull한다.
heaten(t'):
while 트리 최소 melt time <= t':
해당 노드 재계산(자식 비교 → 새 winner, 새 melt time)
부모로 전파
현재 시간 = t'
복잡도: amortized \(O(\log^2 n)\) per advance
핵심은 녹는 횟수의 총합 분석이다. 두 직선은 최대 한 번 교차하므로, "한 노드에서 특정 함수쌍의 추월"은 시간 진행 동안 제한적으로 일어난다. Davenport–Schinzel 수열 이론으로, 일차함수 \(n\)개의 하부 포락선(lower envelope)의 복잡도는 \(O(n)\)이고, 세그먼트 트리 계층 전체에서 총 melt 횟수가 \(O(n \log n \cdot \alpha(n))\) 수준으로 묶인다.
따라서 시간 전진 전체에 걸친 총비용이 \(O((n + q)\log^2 n \cdot \alpha)\) 정도. 단조 시간이라는 가정이 결정적이다(역방향 시간은 깨짐).
가능한 질의 확장
| 질의 | 인코딩 |
|---|---|
| 구간 최솟값 \(\min_i f_i(t)\) | 표준 KST |
| 어떤 \(i\)가 최소인가 | winner 인덱스 저장 |
| 합/카운트 | melt마다 갱신, 단 amortize 주의 |
직선들의 동적 하부 포락선을 "단조 시간"으로 본다는 것이 핵심 관점이다. 다음 강의에서 구현.