문제 링크
- https://icpc.me/2601
문제 출처
- 2004 KOI 중등 3번
사용 알고리즘
- 스위핑
- 세그먼트 트리
시간복잡도
- $O(N \log N)$
풀이
직사각형 $[x_1,x_2]\times[y_1,y_2]$가 정사각형 $[x-k,x]\times[y-k,y]$으로 가려질 조건은 다음과 같습니다.
- $x-k \leq x_1 \leq x_2 \leq x$
- $y-k \leq y_1 \leq y_2 \leq y$
이런 상황에서 문제를 풀 때는 최대한 적은 개수의 변수에 대한 식으로 조건을 표현하는 것이 좋습니다. 그러므로 두 부등식을 각각 $x, y$의 구간 형태로 나타내어 봅시다.
- $x_2 \leq x \leq x_1+k$
- $y_2 \leq y \leq y_1+k$
카펫을 적당히 배치했을 때 가릴 수 있는 직사각형의 최대 개수를 구해야 합니다. 이 문제는 직사각형마다 2차원 배열의 $[x_2,x_1+k]\times[y_2,y_1+k]$ 구간에 1을 더한 다음, 배열의 최댓값을 구해서 해결할 수 있습니다. 하지만 2차원 쿼리는 귀찮기 때문에 플레인 스위핑을 사용할 것입니다.
$x$좌표를 기준으로 스위핑합시다. 구체적으로, $x_2$를 만나면 $[y_2,y_1+k]$ 구간을 1 증가시키고, $x_1+k$를 지나면 $[y_2,y_1+k]$를 구간을 1 감소시킵니다. 구간에 어떤 값을 더하는 쿼리와 수열의 전체 원소의 최댓값을 구하는 쿼리를 처리해야 하고, 이는 세그먼트 트리로 처리할 수 있습니다.
각 $x$좌표에서의 이벤트를 모두 처리한 다음 세그먼트 트리의 루트 정점의 값을 참조하는 방식으로 구현하면 전체 문제를 $O(N \log N)$ 시간에 해결할 수 있습니다.
전체 코드
1 |
|