
붐힐 마을 주변 바다에서 배찌와 다오 친구들은 불법 물풍선 투척, 아이템 밀수, 무단 맵 침입 등을 감시하기 위해 해안선 경비대를 꾸렸다. 해안선 경비대는 바다의 가상 수평선 위의 특정 위치에 물풍선을 설치하고 정박하며 해안선을 감시한다.
해안선은 꺾은선 로 표현할 수 있는데, 꺾은선이란 좌표가 오름차순으로 정렬된 평면상의 점 에 대해, 인접한 두 점 와 을 선분으로 이은 선분들의 집합을 의미한다. 편의상, 이 개의 점을 꺾은선 의 꼭짓점이라고 하자.
평면상에 수평선분 이 존재하며, 해안선 경비대원은 수평선분 위의 한 점으로 나타낼 수 있다. 이때, 수평선분 의 양 끝점의 좌표는 과 의 좌표와 일치한다. 또한, 수평선분 의 좌표는 이며, 꺾은선 의 모든 꼭짓점의 좌표는 보다 크다.
꺾은선 의 꼭짓점은 해안선의 변화점으로, 불법 활동이 발생하기 쉬운 지점이므로 해안선 경비대의 각별한 주의와 감시가 필요하다. 따라서, 수평선분 위에 적절히 해안선 경비대원을 배치하여 모든 꼭짓점을 감시할 수 있어야 한다. 수평선분 위의 해안선 경비대원이 꺾은선 의 꼭짓점을 감시할 수 있으려면, 해안선 경비대원을 나타내는 점과 꼭짓점을 잇는 선분이 양 끝점을 제외하고 꺾은선 와 만나서는 안 된다.

왼쪽 그림은 해안선을 표현하는 꺾은선 와 해안선 경비대원이 위치할 수 있는 수평선분 을 나타낸 것이다. 오른쪽 그림에서, 위치에 해안선 경비대원이 있을 때, 개의 꼭짓점을 감시할 수 있다. 마찬가지로, 위치에 해안선 경비대원이 있을 때도 개의 꼭짓점을 감시할 수 있다. 감시할 수 있는 꼭짓점은 각각 빨간색 점선과 파란색 점선으로 연결되어 있다.
꺾은선 의 모든 꼭짓점을 감시할 수 있는 최소 해안선 경비대원의 수를 구하는 프로그램을 작성하라.
입력 형식
첫 줄에 꺾은선 의 꼭짓점의 수를 나타내는 정수 이 주어진다. ()
이어지는 개의 줄의 번째 줄에는 꺾은선 의 꼭짓점 의 좌표와 좌표를 나타내는 두 정수 와 가 공백으로 구분되어 주어진다. ( )
이상 이하인 에 대하여, 을 만족하고, 이상 이하인 에 대하여, , , 가 한 직선 위에 있지 않음이 보장된다.
출력 형식
첫 줄에 꺾은선 의 모든 꼭짓점을 감시할 수 있는 최소 해안선 경비대원의 수를 출력한다.
예제
입력
10 0 9 2 3 5 10 7 9 10 2 11 10 14 11 17 10 18 3 20 2
출력
2
예제 설명
입력 예제의 상황은 본문의 그림과 같다. 그림에서 위치와 위치에 해안선 경비대원이 있으면, 꺾은선 의 모든 꼭짓점을 감시할 수 있다. 한 명의 해안선 경비대원으로 모든 꼭짓점을 감시할 수는 없다.
채점 방식
입력 케이스들은 다음과 같은 종류로 구별되며, 한 종류의 케이스를 다 맞혀야 그 종류에 배정된 점수를 받을 수 있다.
종류 1: 25점
종류 2: 40점
종류 3: 35점
추가적인 제한 조건이 없음.
해설
수평선분을 무한히 확장해서 직선으로 생각해도 답에는 변화가 없다. 을 직선이라고 생각하고 문제를 풀자.
각 해안선의 변화점을 감시할 수 있는 수평선 위의 점들은 항상 열린 구간을 이루게 된다. 각 해안선의 변화점을 감시할 수 있는 점들의 좌표의 하한과 상한을 계산한다.
하한을 계산하기 위해서, 스택을 사용한다. 편의상 의 가장 왼쪽 점을 이라고 하자. 스택에 삽입하고, 점들을 차례로 순회한다. 현재 를 보고 있다고 하자. 현재 스택에 있는 점의 개수가 미만이면 스택에 를 삽입하고 종료한다. 그렇지 않다면, 현재 스택의 가장 위의 두 점을 , 라고 하자. 이때, , , 에 대해 ccw를 조사한다. 결과가 보다 크다면, 즉, 반시계 방향이면, 스택에 를 삽입하고 종료한다. 그렇지 않으면 스택의 가장 위의 점을 삭제하고 이 과정을 반복한다. 이때, 각 점에 대응되는 정점들로 트리를 구성한다. 는 번 정점에 대응된다. 점들을 순회하는 과정에서, 이 스택에 삽입될 때, 스택의 가장 위에 있던 점을 라고 하자. 이때, 번 정점의 조상은 번 정점이 된다. 번 정점이 루트가 된다. 구성된 트리에서, 번 정점부터 번 정점까지의 점들로 이어진 chain의 정점에 대응되는 점들은 하나의 convex chain이 된다. 각 해안선의 변화점을 감시할 수 있는 점과 해안선의 변화점을 이은 선분은 와 만나지 않으므로, 를 감시할 수 있는 점들의 좌표의 하한은, 트리에서 번 정점의 조상이 번 정점이라고 할 때, 와 를 지나는 직선과, 의 교점의 좌표가 라고 하자. 즉, 를 감시할 수 있는 점들의 좌표는 보다 크다.
상한도 하한와 비슷하게 의 가장 오른쪽 점에서부터 시작하여 계산해서 구할 수 있다. 이를 라고 하자. 즉, 를 감시할 수 있는 점들의 좌표는 보다 크다.
이렇게 각 점에 대해 해당 점을 감시할 수 있는 구간을 다 구한 후, 가 증가하는 순으로 구간들을 정렬한 후, 그리디하게 문제를 해결한다. 정렬된 순서대로 구간을 확인하면서, 현재 경비대원을 배치할 수 있는 구간과 보고 있는 구간이 교집합이 있는지 확인하고, 없으면 경비대원을 배치한 방식으로 문제를 풀 수 있다.