문제 링크
- https://icpc.me/26613
사용 알고리즘
- CHT
- 파라메트릭 서치
시간복잡도
- $O(N \log N \log X + Q \log N \log^2 X)$
풀이
최적화 문제 대신 결정 문제를 해결합시다. 즉, 상수 $k$가 주어졌을 때 $(S_r-S_l)/(r-l) \geq k$를 만족하는 $a \leq l \leq b \leq c \leq r \leq d$가 존재하는지 판별하는 문제를 해결합시다.
부등식을 전개하면 $rx-S_r \leq lx-S_l$이 됩니다. 즉, $a \leq l \leq b$에서는 $lx-S_l$을 최대화해야 하고, $c \leq r \leq d$에서는 $rx-S_r$을 최소화해야 합니다. 일차 함수가 여러 개 있을 때 특정 $x$좌표에서 최대/최소를 빠르게 구하는 방법은 Convex Hull Trick이라는 이름으로 잘 알려져 있습니다.
하지만 이 문제에서는 전체 직선이 아닌 구간에 있는 직선만 고려해야 한다는 점이 조금 다릅니다. 이런 경우에는 세그먼트 트리의 각 정점마다 CHT를 관리하는 것으로 해결할 수 있습니다. 일반적인 CHT의 시간 복잡도에 $log$가 하나 붙게 됩니다.
만약 CHT를 Li Chao Tree를 이용해 구현했다면 세그먼트 트리를 만드는 것은 $O(N \log N \log X)$, 쿼리의 정답을 구하는 것은 매번 $O(N \log N \log^2 X)$가 됩니다. 따라서 전체 시간 복잡도는 $O(N \log N \log X + Q \log N \log^2 X)$가 되고, $N, Q$가 별로 크지 않고 시간 제한이 5초나 되기 때문에 문제를 해결할 수 있습니다.
전체 코드
1 |
|