문제 링크
- http://icpc.me/15939
문제 출처
- 2018 UCPC B번
풀이
각 쿼리는 주어진 두 점 $p_1, p_2$의 위치에 따라 3가지 경우로 나눌 수 있습니다.
- 두 점 모두 다각형 외부에 존재
- 두 점 중 한 개가 다각형 외부, 한 개는 내부에 존재
- 두 점 모두 다각형 내부에 존재
1번의 답은 0입니다.
2번의 답은 ($p_1$이 다각형 외부로 나가기 위해 지나는 대각선의 개수)입니다.
3번의 답은 min($p_1, p_2$가 모두 다각형 외부로 나가기 위해 지나는 대각선의 개수, $p_1, p_2$를 잇는 선분과 교차하는 대각선의 개수)입니다.
(어떤 점이 다각형 외부로 나가기 위해 지나는 대각선의 개수)와 (두 점을 잇는 선분과 교차하는 대각선의 개수)를 $O(N)$ 정도에 구해야 합니다.
다각형의 꼭짓점에 각각 반시계 방향으로 0부터 N-1까지의 번호를 붙여줍시다.
다각형 내부에 점 p가 주어졌을 때, i번째 꼭짓점에 대해 ccw(i, j, p) > 0
인 j의 범위는 [i+1, k] 형태로 표현할 수 있습니다.
k는 단조 증가하기 때문에, 모든 i에 대한 k값을 $O(N)$에 구할 수 있고, 이를 nxt_p[i]
라고 정의합시다.
두 점 $p_1, p_2$를 연결하는 선분 $l$과 교차하는 대각선의 개수를 먼저 구해봅시다.
다각형의 $i$번째 꼭짓점에서 출발하는 대각선 중에서 $l$과 교차하는 대각선의 개수는 $\vert nxt_{p_1}[i] - nxt_{p_2}[i] \vert$입니다. 모든 $i$에 대해 저 값을 구해준 뒤 2로 나눠주면 됩니다.
점 $p$에서 다각형 밖으로 나갈 때 지나는 대각선의 개수를 구해봅시다.
점 $p$에서 다각형의 $i, i+1$번째 꼭짓점을 잇는 변을 통해 외부로 나갈 때, 몇 개의 대각선을 지나야 하는지 구하고 그 중 최솟값을 취하면 됩니다.
위 그림의 가장 아래에 있는 점에서 출발하는 대각선들만 고려했을 때, 다각형의 각 변으로 나갈 때 거치는 대각선의 개수를 봅시다.
nxt_p[i]
이후에 있는 각 변에는 +0, +1, +2, …이 더해지고, nxt_p[i]
이전에 있는 각 변에는 +1, +2, +3이 더해집니다. 빨간색 글씨로 되어있는 부분은 수가 1씩 증가하면서 순차적으로 더해지고, 파란색 글씨로 되어있는 부분은 마지막에 더해진 값이 한 번 더 반복됩니다.
빨간색 글씨처럼 구간에 등차수열을 더하는 것은 누적합 배열 2개를 이용해서 처리할 수 있습니다.
모든 꼭짓점에 대해, 각 변으로 나갈 때 거쳐야 하는 대각선의 개수를 구해서 더한 뒤 2로 나눈 값이 우리가 원하는 값이 됩니다.
기하 문제 특성상 한 번에 풀기 어렵습니다. 문제를 풀면서 직접 만든 데이터를 정답 코드 아래에 올렸습니다. 디버깅할 때 유용하게 쓰일 수 있습니다.
전체 코드
1 |
|
테스트용 예제
1 |
|