잉크 얼룩

시간 제한1초메모리 제한128 MB

요약
서로 만나지 않거나 두 점에서 교차하는 원을 최대 100개 줄 때, 평면이 나뉘는 흰 영역의 개수를 센다.
난이도

어려움10점 중 8점

유형
기하, 그래프, 유니온 파인드, 구현
정답자
아직 제출이 없습니다

문제

그림 1: 흰색 영역 1개그림 2: 흰색 영역 3개그림 3: 흰색 영역 4개

검은 잉크 방울이 흰 종이 위에 떨어져 둥근 잉크 얼룩을 만든다. 위에 세 가지 예가 있다. 얼룩들은 종이를 여러 개의 서로 다른 흰색 영역으로 나눌 수 있다. 그림 1에는 흰색 영역이 하나뿐이다. 그림 2에는 바깥쪽 흰색 영역과, 왼쪽 얼룩 네 개로 둘러싸인 작은 흰색 영역, 그리고 오른쪽 얼룩 세 개로 둘러싸인 더 작은 흰색 영역이 있다. 그림 3에는 흰색 영역이 네 개 있다. 하나는 가장 바깥쪽, 하나는 바깥 고리 안쪽이면서 가운데 네 얼룩의 바깥쪽에 있고, 나머지 두 개는 안쪽 얼룩 네 개 중 세 개씩으로 각각 만들어지는 아주 작은 영역이다.

두 점이 같은 흰색 영역에 속한다는 것은, 두 점을 잇는 경로를 흰색 점만 지나도록 그릴 수 있다는 뜻이다. 얼룩들의 중심과 반지름이 주어질 때, 흰색 영역의 개수를 구하여라.

기하 참고. 원 C1C_1의 중심이 (x1,y1)(x_1, y_1), 반지름이 r1r_1이고, 원 C2C_2의 중심이 (x2,y2)(x_2, y_2), 반지름이 r2r_2이며, 두 원이 서로 다른 두 점에서 만난다고 하자. 두 중심 사이의 거리를 dd, A=atan2⁡(y2−y1,  x2−x1)A = \operatorname{atan2}(y_2 - y_1,\; x_2 - x_1), B=arccos⁡ ⁣(r12+d2−r222r1d)B = \arccos\!\left(\dfrac{r_1^2 + d^2 - r_2^2}{2 r_1 d}\right)라 하면, 두 교점은 C1C_1의 중심에서 양의 xx 방향으로 뻗은 반직선을 기준으로 반시계 방향으로 각각 A+BA + B, A−BA - B 라디안 위치에 있다.

입력

입력은 1개 이상 15개 이하의 데이터 집합으로 이루어지며, 마지막 줄에는 숫자 00 하나만 있다.

각 데이터 집합은 얼룩의 개수 nn(1≤n≤1001 \le n \le 100)이 적힌 줄로 시작한다. 이어서 양의 정수 3n3n개가 공백 또는 줄바꿈으로 구분되어 주어진다. 연속한 세 정수는 얼룩 하나를 나타내며, 순서대로 중심의 xx 좌표, yy 좌표, 반지름이다. 이 정수들은 모두 1,000,0001{,}000{,}000 이하이다.

모든 얼룩은 종이 안에 완전히 놓여 있고, 어떤 얼룩도 종이의 가장자리에 닿지 않는다. 완전히 같은 원은 없다. 서로 다른 두 원은 서로 다른 두 점에서 만나거나 전혀 만나지 않는다. 두 원이 만나면 최소 한 단위 이상 겹친다. 즉 반지름이 r1≤r2r_1 \le r_2이고 두 중심 사이 거리가 dd일 때 r2−r1+1≤d≤r1+r2−1r_2 - r_1 + 1 \le d \le r_1 + r_2 - 1이다. 세 개 이상의 원이 한 점에서 만나는 일은 없다. 어떤 원 CC가 다른 원과 적어도 하나 만난다면, CC 위의 서로 다른 두 교점은 최소 0.0010.001 라디안 이상 떨어져 있다. 이 조건들 덕분에 표준 배정밀도(double) 연산으로 충분하다.

출력

각 데이터 집합에 대해 흰색 영역의 개수를 한 줄에 출력한다. 이 개수는 200200을 넘지 않는다.

주의. 이 문제를 무차별 래스터(픽셀 단위) 방식으로 풀면 메모리를 너무 많이 쓰고 너무 느리다.

예제4

  1. 예제 1

    입력
    4
    45 45 40 65 55 35 45 45 10 20 95 10
    5
    30 30 20 30 60 20 60 30 20 60 60 20 90 45 15
    16
    200 120 65 300 100 55 400 120 65 480 200 65
    500 300 55 480 400 65 400 480 65 300 500 55
    200 480 65 120 400 65 100 300 55 120 200 65
    300 245 60 300 355 60 385 300 51 215 300 51
    0
    
    예상 출력
    1
    3
    4
    
  2. 예제 2

    입력
    1
    50 50 20
    0
    
    예상 출력
    1
    
  3. 예제 3

    입력
    2
    10 10 8
    20 10 8
    0
    
    예상 출력
    1
    
  4. 예제 4

    입력
    4
    30 30 20
    30 60 20
    60 30 20
    60 60 20
    0
    
    예상 출력
    2