그 유명한 금광 세그, 중등부 올림피아드에서 나와 아무도 풀지 못했습니다. 그건 알겠는데, 금광 세그가 뭐죠? 오늘 함께 알아가봅시다!
문제
https://www.acmicpc.net/problem/16993
틀린 풀이
https://www.acmicpc.net/problem/10999
위 문제처럼 문제를 푸는것은 안돼요! 이것은 최대 구간합을 구하지 못해, 오히려 그냥 누적합으로 구간합을 구하는 것이 더 빨라요!
그렇다고 해서 구간합을 누적합을 사용하고 최대값 - 최소값을 하면 최소값이 최대값의 오른쪽에 있을 수 있다는 반례가 있습니다!
금광 세그를 이용한 풀이
그렇다면 이 문제는 어떻게 해결해야 할까요? 이 문제를 해결할 수 있는 테크닉을 금광 세그라고 합니다. 이 문제를 풀려면 마치 이분탐색을 하는 것처럼 풀어야 합니다.
f(i, j) = A[i], A[i+1], …, A[j]에서 가장 큰 연속합 (1 ≤ i ≤ j ≤ N)이라 정의하겠습니다! 히스토그램에서 가장 큰 직사각형을 세그먼트 트리로 풀어보신 분들은 그 문제를 어떻게 풀었는지 다시 한번 생각해 봅시다. 문제를 두 작은 문제로 계속 변환하여 이분탐색처럼 해결했죠? 이 문제도 비슷합니다! 문제를 더 작은 문제 2개로 분활하여 문제를 푸는 것입니다!
mid = (i + j) / 2
f(i, j) = max(f(i, mid), f(mid + 1, j), (두 케이스를 합친 경우))
소스코드
1 |
|