Union of Circles

문제 정보

    • 문제 ID
    • 시간 제한
    • 메모리 제한
    • 제출 횟수
    • 정답 횟수 (비율)
    • 출제자
    • 출처
    • 분류

문제

$N$개의 원들의 영역의 합집합의 넓이를 구하는 법에 대해 생각해봅시다.

그린 정리에 의해 임의의 폐곡선 $C$의 넓이를 구하는 식은 다음과 같습니다.

\[
\frac{1}{2} \oint_C \! x \, \mathrm{d}y - y \, \mathrm{d}x
\]

원들이 다음과 같이 주어져 있다고 합시다. 이 원들을 폐곡선으로 나타내는 것은 가장 외곽에 있는(호가 다른 원에 포함되지 않는 부분)부분이 원의 중심을 기준으로 어느 각도의 구간에 포함되는지 검사하면 됩니다.

이제 각 원을 원의 중심$(x_c,y_c)$를 기준으로 한 각도를 매개변수로 하여 식을 만들면

\[
\begin{cases} x=x_c+r_c \cos \theta \\ y=y_c+r_c \sin \theta \end{cases}
\]

가 되고, 또한 각 원에 대해 외곽선에 원의 중심을 기준으로 각도가 $[s_i,e_i]$인 호가 포함되는 경우 위의 넓이를 구하는 식을 이용하여 더해주시면 됩니다.
하나의 원과 나머지 원에 의해 생기는 교점의 수는 $O(N)$개 이므로, 이로 인해 생기는 호가 다른 원에 포함되는지 안되는지 따져보는 것으로 전체시간 $O(N3)$에 원들의 넓이를 구할 수 있습니다. 그러나 약간의 개선을 통하여 $O(N2lgN)$의 시간에 구할 수도 있습니다. $N$개의 원들을 입력받아 그 합집합의 넓이를 구하는 프로그램을 작성해주세요.

입력

입력은 $T$ 개의 테스트 케이스로 구성된다. 입력의 첫 줄에는 $T$가 주어진다.

각 테스트 케이스에 대해, 첫 번째줄에 정수 $N (1 \leq N \leq 3,000)$ 이 주어진다. 이는 주어지는 원의 개수이다.
그리고 다음 $N$줄에는 각 원의 중심의 좌표와 반지름을 나타내는 정수 $X$ $Y$ $R$이 공백으로 구분되어 순서대로 주어진다. $(-10,000 \leq X, Y \leq 10,000, 1 \leq R \leq 10,000)$

출력

각 테스트 케이스마다 한 줄에 하나씩 답 출력한다. 절대/상대 오차가 1e-8이하인 답은 정답으로 인정한다.

예제 입력

3
2
0 0 1
1 0 1
2
0 0 1
1 1 1
3
0 0 3
1 1 2
2 2 1

예제 출력

5.0548156086
5.7123889804
29.8989831391

노트

5개의 댓글이 있습니다.