문제 링크
- http://icpc.me/10167
문제 출처
- 2014 KOI 전국 본선 중등부 4번
사용 알고리즘
- 세그먼트 트리
- 스위핑
시간복잡도
- O(N2 log N)
풀이
KOI 초/중등부에 자주 나왔던(고기잡이, 금강석 등등) 아이디어를 하나 떠올려봅시다.
각 변에 모두 하나 이상의 금광이 걸쳐 있는 직사각형만 봐도 항상 정답을 찾을 수 있습니다.
그러므로 x, y좌표를 각각 압축해주면 x, y값이 각각 최대 6000개 존재하게 됩니다.
범위가 최대 6000이므로 O(N2 log N) 정도의 풀이를 생각해볼 수 있습니다.
직사각형의 가로 변을 정할 때 금광의 y좌표들 중에서 가능한 모든 (y1, y2)쌍을 선택해보면 O(N2)이 걸립니다. 만약 (y1, y2)가 고정되었을 때 최댓값을 O(log N)만에 구할 수 있다면 O(N2 log N)만에 문제를 풀 수 있습니다.
이제는 점점 웰노운이 되어가는, (l, r) 구간 안에서 연속 부분 최댓값을 저장하는 세그먼트 트리를 사용한다면 (y1, y2)가 고정되었을 때 최댓값을 O(log N)만에 구할 수 있습니다.
구현 방법을 다시 정리해보면
- 점들을 y좌표 기준으로 정렬
- y1을 고정하고 세그 트리 초기화
- y1부터 시작해서 y좌표를 점점 증가시켜가며 직사각형에 넣어주면서 세그 트리 갱신
y좌표가 같은 점은 동시에 직사각형에 넣어야 하는 것만 주의해주면 됩니다.
전체 코드
1 |
|