문제 링크
- http://icpc.me/6181
문제 출처
- 2008 USACO US Open Gold 3번
사용 알고리즘
- 분할 정복
시간복잡도
- $O(N \log N)$
풀이
맨허튼 거리($L_1$, $d = \vert x_1 - x_2\vert + \vert y_1 - y_2\vert$)를 45도 회전시키면 체비셰프 거리($L_{\infty}$, $d = \max(\vert x_1 - x_2\vert, \vert y_1 - y_2\vert)$)가 됩니다.
입력으로 주어진 좌표 $(x, y)$를 $(x+y, x-y)$로 변환한 다음, 체비셰프 거리에서 해결합시다.
좌표들을 x좌표 기준으로 정렬합시다.
가운데 있는 점 $m$을 잡고, x좌표가 $[x_m - k, x_m + k]$ 구간에 있는 점들만 고려할 것입니다. 해당 점들을 y좌표 순으로 정렬하고, 투포인터 느낌으로 쭉 훑어주면서 거리가 k 이하인 점을 Union하면 됩니다.
x좌표 기준으로 정렬되어 있는 점을 다시 y좌표 순으로 정렬하는 것이 문제가 될 수 있는데, 분할 정복의 “정복” 단계에서 Merge Sort 하듯이 정렬해주면 됩니다.
$T(N) = 2T(N/2) + O(N)$이므로 $O(N \log N)$에 문제를 해결할 수 있습니다.
전체 코드
1 |
|