문제 링크
- http://icpc.me/18252
문제 출처
- Good Bye, BOJ 2019 F번
사용 알고리즘
- Convex Hull
- Two Pointer
시간복잡도
- $O(N^2)$
풀이
가장 위에 있는 점($p_1$)과 가장 아래에 있는 점($p_2$)은 움직일 수 없다는 점에서 풀이가 시작됩니다.
$p_1$과 $p_2$를 이은 직선 $l$을 그려봅시다.
만약 레일이 직선 $l$과 교차한다면 교차하는 지점에 별을 달아주는 것이 넓이가 0이 되기 때문에 최적입니다.
교차하지 않는다면 최대한 직선 $l$과 가깝게 배치하는 것(오른쪽 끝 or 왼쪽 끝)이 최적입니다.
매우 직관적인 관찰이고, 엄밀한 증명은 어떤 논문(Keikha, Vahideh & Löffler, Maarten & Mohades, Ali. (2017). Largest and Smallest Area Triangles on a Given Set of Imprecise Points.)에 나와있습니다.
점을 적절히 배치했으니 최대 넓이 삼각형만 구하면 됩니다.
가장 넓은 삼각형을 이루는 꼭짓점은 모두 convex hull 위에 있습니다. 그리고 convex hull에서 두 점을 골라 직선으로 이어주면, 해당 직선과 다른 점들의 거리는 증가했다가 감소하는, convex하다는 것을 알 수 있습니다.
이 점을 이용해 convex hull을 구한 뒤, 두 점을 고정해서 밑 변으로 잡고 two pointer 기법으로 최대 넓이를 $O(N^2)$에 구해줄 수 있습니다.
전체 코드
1 |
|