문제 링크
- http://icpc.me/18571
사용 알고리즘
- 병렬 이분 탐색
- 컨벡스헐 트릭
풀이
$\displaystyle \frac{\sum_{i=s}^{e}A_i}{e-s+1}$를 최대화하는 문제입니다.
$\displaystyle \frac{\sum_{i=s}^{e}A_i}{e-s+1} \geq k$가 될 수 있는지 판단하는 파라메트릭 서치를 사용합시다. $\displaystyle \sum_{i=s}^{e}(A_i-k) \geq 0$이 될 수 있는지 확인하면 됩니다.
$k$가 고정되어 있을 때 $\displaystyle \sum_{i=1}^{N}(A_i-k)$의 값은 쉽게 구할 수 있습니다. 그러므로 $\displaystyle \sum_{i=s}^{e}(A_i-k)$를 최대화시켜서 0 이상인지 확인하는 것보다는 $\displaystyle \sum_{i=1}^{s-1}(A_i-k)$와 $\displaystyle \sum_{i=e+1}^{N}(A_i-k)$을 각각 최소화시켜서 남은 부분이 0 이상인지 확인하는 것이 편할 것 같습니다.
두 함수 $f_t(k), g_t(k)$를 정의합시다.
- $\displaystyle f_t(k) = -tk + \sum_{i=1}^{t}(A_i-k)$
- $\displaystyle g_t(k) = -(N-t+1)k + \sum_{i=t}^{N}(A_i-k)$
두 함수는 $k$에 대한 일차함수입니다.
$\displaystyle \sum_{i=1}^{s-1}(A_i-k)$의 최솟값은 $f_1(k), f_2(k), \ldots, f_{t-1}(k)$의 최솟값과 같고, $\displaystyle \sum_{i=e+1}^{N}(A_i-k)$의 최솟값은 $g_{t+1}(k), g_{t+2}(k), \ldots, g_N(k)$의 최솟값과 같습니다.
Convex Hull과 Parallel Binary Search을 구현해주면 문제를 풀 수 있습니다.
전체 코드
1 |
|