문제 링크
- http://icpc.me/17973
문제 출처
- 2019 서울 리저널 F번
사용 알고리즘
- Rotating Sweep Line
시간복잡도
- $O(N^2 \log N)$
풀이
N개의 점으로 만들 수 있는 모든 사각형 중
- 볼록 다각형이면서 넓이가 $\alpha$이면 4점
- 오목 다각형이면서 넓이가 $\alpha$이면 3점
- 볼록 다각형이면서 넓이가 $\alpha$가 아니면 2점
- 오목 다각형이면서 넓이가 $\alpha$가 아니면 1점
을 얻는다고 했을 때, 총점을 구하는 문제입니다. 이때 $\alpha$는 만들 수 있는 사각형의 넓이 중 최솟값입니다.
점수 계산 방식을 아래처럼 바꿀 수 있습니다.
- 볼록 다각형이면 2점
- 오목 다각형이면 1점
- 넓이가 $\alpha$면 2점 추가
볼록사각형은 대각선이 2개, 오목사각형은 대각선이 1개이므로 이렇게 바꿔줄 수도 있습니다.
- 대각선 하나당 1점
- 넓이가 $\alpha$인 사각형 하나당 2점
이제 우리는 대각선의 개수를 구하는 문제와 만들 수 있는 사각형의 최소 넓이를 구하는 문제를 풀면 됩니다.
대각선의 개수
사각형에 사용할 두 점을 고정시켜봅시다.
두 점을 잇는 선분을 대각선으로 하는 사각형의 개수는 빨간선을 기준으로 나누어진 반평면에 속한 점의 개수의 곱입니다.
대각선의 개수를 구하기 위해서 두 점을 고정하는 $n(n-1)/2$가지의 경우마다 어떤 점이 어떤 반평면에 속하는지 알아야 합니다.
두 점 a, b을 잇는 선분에 수직인 직선을 그려서, 모든 점을 그 직선에 사영시켜봅시다.
사영시킨 다음 좌표를 기준으로 정렬하면, a 혹은 b를 기준으로 두 반평면이 구분됩니다.
$n(n-1)/2$가지의 경우에 대해 모두 사영시킨 결과의 순서를 빠르게 계산할 수 있다면 대각선의 개수도 빠르게 구할 수 있습니다.
$n(n-1)/2$개의 선분을 기울기 순으로 정렬하고 순서대로 보면, 각 선분을 전후로 inversion이 발생하는 점의 쌍은 하나밖에 없고, 이 두 점은 인접하면서 그러한 두 점은 해당 선분이 잇는 두 점입니다.
그러므로 우리는 $O(N^2)$ 만에 모든 순서를 다 알아낼 수 있고, 대각선의 개수도 $O(N^2)$에 구할 수 있습니다.
최소 넓이
이번에도 두 점을 고정시킨 다음 두 점을 잇는 선분과 수직인 직선에 사영을 하고 시작합시다.
이렇게 사영시켰을 때 고정시킨 두 점의 순서를 각각 a, b라고 합시다. (a < b)
당연히 b - a = 1입니다.
고정시킨 두 점을 이용하면서 최소 넓이 사각형이 될 수 있는 후보는
- a-2번째, a번째, b번째, b+1번째 점으로 만든 사각형
- a-1번째, a번째, b번째, b+1번째 점으로 만든 사각형
- a-2번째, a번째, b번째, b+2번째 점으로 만든 사각형
- a-1번째, a번째, b번째, b+2번째 점으로 만든 사각형
총 4가지입니다.
a-2, a-1, a, b를 이용하는 경우 같은 건 다른 선분에 대해 처리할 때 고려하기 때문에 생각할 필요가 없습니다.
각 선분마다 사각형 4개를 보면서 최소 넓이와 개수를 카운팅하면 문제를 풀 수 있습니다.
전체 코드
1 |
|