BOJ 14605 Over Fitting (Large)
문제 내용
2차원 평면에 개의 점이 주어집니다. 직선을 하나 그어서 라벨이 LOVELYZ인 점들과 아닌 점들을 나누려고 합니다. 한쪽 영역에 LOVELYZ가 아닌 모든 점들을 넣어야 한다고 할 때,
반대쪽 영역에 넣을 수 있는 LOVELYZ 점의 개수의 최댓값을 구하세요.
입력
첫 줄에 점의 개수 이 주어집니다. ()
다음 줄에 걸쳐서 개의 점의 정보가 한 줄에 하나씩 주어집니다. 하나의 점의 정보는 좌표, 좌표, 라벨 순으로 주어집니다. (, 라벨의 길이는 15 이하이며 영어 대문자로만 이루어져 있음)
라벨이 LOVELYZ인 점과 아닌 점은 각각 3개 이상씩 존재하며, 세 점이 한 직선 위에 놓이는 경우는 없습니다.
출력
문제의 정답을 출력합니다.
문제 풀이
스포일러
LOVELYZ인 점을 yes점, 아닌 점을 no점이라고 합시다. 직선을 기준으로 no 영역은 모든 no점을 포함해야 하므로, 최적의 직선은 no점들의 convex hull에 접한 직선들 중 하나입니다.
따라서 먼저 convex hull을 구한 뒤에 그 convex hull의 각각의 꼭짓점에서 직선을 돌려서 각도 스위핑을 하여 반대편에 속한 yes점의 개수의 최댓값을 구할 수 있습니다.
모든 꼭짓점에서 5000개의 점을 통으로 각도 정렬을 하면 이 되어 통과하기 어렵겠지만, 스위핑에서 실질적으로 닿는 점들만 뽑아낸 뒤에 정렬을 하면 모든 꼭짓점에 걸쳐서 각 점이 뽑히는 횟수는 정확히 2번임을 증명할 수 있습니다. 따라서 이때 시간 복잡도는 각 꼭짓점에서 스위핑의 대상을 골라내는 과정의 에 바운드되어 통과할 수 있습니다.