[BOJ 31397] 반 나누기 (Hard)

View as PDF

Submit solution

Points: 4
Time limit: 1.0s
Memory limit: 1G

Problem types
Allowed languages
Assembly, Awk, C, C++, Java, Pascal, Perl, Python, Sed, Text

루타비스의 수호자, 시간술사 반반은 모든 음식을 반으로 먹는 것을 즐깁니다. 비록 후라이드 양념 반반 치킨을 먹지는 않지만, 중식은 항상 짬짜면을, 피자집에서는 항상 하프 앤 하프 피자를 주문합니다.

생일을 맞은 반반은 그의 동료인 어릿광대 피에르에게서 볼록다각형 모양의 케이크를 하나 선물받았습니다. 반반은 이 케이크를 일직선으로 한 번 잘라서 반으로 나눠 먹고 싶습니다. 특히 나눠진 후의 케이크 밑면의 면적과 둘레가 똑같도록 하고 싶습니다.

반반이 원하는 대로 케이크를 두 조각으로 나눌 수 있을까요?

입력 형식

첫 줄에는 반반이 선물받은 케이크 밑면의 모양인 볼록다각형의 꼭짓점 개수 $N$이 주어집니다. $(3 \le N \le 200\,000)$

다음 $N$개의 줄의 $i$번째 줄에는 볼록다각형의 $i$번째 점의 좌표를 의미하는 두 정수 $x_i, y_i$가 공백으로 구분되어 주어집니다. $(-10^7 \le x_i, y_i \le 10^7)$

꼭짓점은 다각형의 어느 한 점에서 시작해서 반시계방향으로 주어지며, 서로 다른 세 점이 한 직선 위에 있는 경우는 없습니다.

출력 형식

첫 줄에, 케이크를 넓이와 둘레가 같은 두 도형으로 분할할 수 있다면 YES, 없다면 NO를 출력하세요.

첫 줄에 YES를 출력한 경우, 칼질을 시작하고 끝내는 두 점이 각각 $x_j$와 $x_{j+1}$의 $\alpha : 1-\alpha$ 내분점, $x_k$와 $x_{k+1}$의 $\beta: 1-\beta$ 내분점인 경우, 둘째 줄에 $j$와 $\alpha$를 공백으로 구분하여, 셋째 줄에 $k$와 $\beta$를 공백으로 구분하여 출력하세요. 이 때, $x_{N+1} = x_1$이라고 생각합니다. $(1 \le j, k \le N;$ $0 \le \alpha, \beta \le 1)$

두 점을 이은 선분을 기준으로 볼록다각형을 나누었을 때, 나뉜 두 도형의 넓이와 둘레의 절대 혹은 상대 오차가 $10^{-6}$ 이하여야 합니다.

예제 입력 1

3
0 0
10 0
5 10

예제 출력 1

YES
1 0.500000000000
2 1.000000000000

예제 입력 2

4
4 0
10 10
0 7
0 6

예제 출력 2

YES
1 0.918970085714
4 0.384322207567

힌트

두 점 $(a, b)$와 $(c, d)$의 $t:1-t$ 내분점은 $(a(1-t)+ct, b(1-t)+dt)$입니다.


Comments

There are no comments at the moment.