문제 링크
- http://icpc.me/16892
사용 알고리즘
- 세그먼트 트리
- 게임 이론
시간복잡도
- $O(N \log N)$
- $O(N)$
풀이
$K = 0$인 경우만 먼저 생각해봅시다.
$N$이 짝수인 경우, 정답은 가운데 있는 두 원소 중 큰 값 ($\max(A[\frac{N}{2}], A[\frac{N}{2}+1])$)입니다. 만약 구사과가 가운데 있는 레몬이 아닌 다른 레몬을 남기기로 결정한다면, 큐브러버가 그 방향에 있는 레몬을 다 먹어서 저지할 수 있습니다. 그렇기 때문에 가운데 있는 레몬이 정답이 됩니다.
$N$이 홀수인 경우, 정답은 $\max( \min(A[\frac{N+1}{2}-1], A[\frac{N+1}{2}]), \min(A[\frac{N+1}{2}], A[\frac{N+1}{2}+1]) )$입니다. 구사과가 레몬 하나를 먹는 순간, 큐브러버가 선공이고 $N$이 짝수인 게임으로 바뀌기 때문입니다.
$B[i] = \min(A[i], A[i+1])$를 정의해서 $N$이 짝수인 문제를 푸는 것과 똑같습니다.
$K > 0$인 경우에는 양쪽 끝을 적절히 잘라낸 다음 게임을 시작하게 됩니다.
- 왼쪽에서 $0$개, 오른쪽에서 $K$개
- 왼쪽에서 $1$개, 오른쪽에서 $K-1$개
- 왼쪽에서 $i$개, 오른쪽에서 $K-i$개
와 같은 총 $K+1$개의 경우에서 정답이 될 수 있는 레몬들을 합집합해주면 연속한 구간이 나오게 됩니다. 세그먼트 트리를 이용해 연속한 구간의 최댓값을 구하면 $O(N \log N)$에 문제를 풀 수 있습니다.
최댓값을 구해야 하는 구간이 점점 확장된다는 점을 이용해 포인터 2개를 관리하는 방식으로 $O(N)$에 문제를 풀 수도 있습니다.
두 가지 코드 모두 올립니다.
전체 코드
O(N log N)
1 |
|
O(N)
1 |
|