题解
모든 점의 볼록 껍질을 구하고, 그 넓이를 라고 하자.
볼록 껍질이 선분이면 점들을 의 사전순으로 정렬하여 출력한다. 이제 볼록 껍질의 넓이가 양수인 경우를 생각하자.
띠의 간격을 으로 정하고, 라고 하자. 다음 두 수평선 격자를 사용한다: 와 . 여기서 는 정수이다.
각 격자에 대해 다음과 같이 후보 순회를 만든다.
- 각 점을 가장 가까운 격자선에 배정한다.
- 격자선을 아래에서 위로 보면서, 격자선 번호 가 짝수이면 배정된 점들을 오름차순으로, 홀수이면 내림차순으로 방문한다.
- 마지막 점과 첫 점을 연결한다.
두 후보의 순회 길이를 계산하고 더 짧은 후보를 출력한다. 볼록 껍질과 넓이는 에 구할 수 있으므로 전체 시간복잡도는 이다.
증명
볼록 껍질의 가로 폭을 , 둘레를 , 지름을 라고 하자. 이다.
하나의 격자를 고정하자. 각 점을 자신이 배정된 수평선으로 수직 투영한다. 볼록 껍질을 위아래로 만큼 확장한 볼록도형을 생각하면 모든 투영점이 이 도형 안에 들어간다. 확장된 도형의 넓이는 , 둘레는 , 지름은 이하이다.
Solution written by GPT5.6