구를 물려받다

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

요약
구들을 통과하는 수평면을 위로 이동시키면서 원판들의 연결 요소 수가 증가하거나 감소하는 순간들을 이벤트 기반으로 정확히 계산해 0과 1의 수열로 출력하는 문제입니다.
난이도

어려움10점 중 8점

유형
유니온 파인드, 기하, 시뮬레이션
정답자
아직 제출이 없습니다

문제

2xxx년, 한 행성에 착륙한 탐사대가 그 행성에 살았던 고대 종족이 만든 기이한 물체들을 발견했다. 각 물체는 불투명한 고체 구들을 담고 있는 투명한 상자이며, 구들의 위치와 반지름을 기록한 것으로 보이는 석판도 여럿 함께 발견되었다.

처음에는 이 물체들의 용도를 알 수 없었으나, 잠벤도르프 교수는 수평면으로 자른 단면이 중요한 역할을 한다는 것을 알아냈다. 수평면을 물체의 아래에서 위로 밀어 올리면 단면이 변한다.

각 단면은 여러 개의 원판으로 이루어지며, 각 원판은 고체 구 하나의 단면이다. 서로 만나거나 닿는 원판들은 하나의 연결 도형으로 합쳐진다. 교수는 수평면이 올라감에 따라 연결 도형의 개수가 어떻게 변하는지에 정보가 담겨 있음을 발견했다.

예를 들어 아래 첫 번째 예제 데이터가 나타내는 물체에서는, 연결 도형의 개수가 z=0.0000,162.0000,167.0000,173.0004,185.0000,191.9996,198.0000,203.0000,205.0000z = 0.0000, 162.0000, 167.0000, 173.0004, 185.0000, 191.9996, 198.0000, 203.0000, 205.0000에서 각각 0,1,2,1,2,3,2,1,00, 1, 2, 1, 2, 3, 2, 1, 0으로 변한다. 증가를 11, 감소를 00으로 나타내면 이 변화의 나열은 88비트 이진수 1101100011011000으로 표현된다.

수평면을 맨 아래(z=0z = 0)에서 맨 위(z=36000z = 36000)까지 밀어 올릴 때의 이러한 변화를 구하는 프로그램을 작성하라.

입력

입력은 여러 개의 데이터셋으로 이루어진다. 각 데이터셋은 구의 개수를 나타내는 양의 정수 NN이 적힌 줄로 시작한다. 이어서 NN개의 줄에 각 구가 설명되며, 각 줄에는 네 개의 양의 정수 Xi,Yi,Zi,RiX_i, Y_i, Z_i, R_i (i=1,…,Ni = 1, \dots, N)가 있어 ii번째 구의 중심 (Xi,Yi,Zi)(X_i, Y_i, Z_i)와 반지름 RiR_i를 나타낸다.

1≤N≤1001 \le N \le 100, 1≤Ri≤20001 \le R_i \le 2000, 0<Xi−Ri<Xi+Ri<40000 < X_i - R_i < X_i + R_i < 4000, 0<Yi−Ri<Yi+Ri<160000 < Y_i - R_i < Y_i + R_i < 16000, 0<Zi−Ri<Zi+Ri<360000 < Z_i - R_i < Z_i + R_i < 36000이라고 가정해도 좋다. ii번째 고체 구는 (x−Xi)2+(y−Yi)2+(z−Zi)2≤Ri2(x - X_i)^2 + (y - Y_i)^2 + (z - Z_i)^2 \le R_i^2를 만족하는 모든 점 (x,y,z)(x, y, z)의 집합이다.

한 구가 다른 구를 포함할 수 있다. 어떤 두 구도 서로 접하지 않는다. 모든 Zi±RiZ_i \pm R_i 값과, 임의의 두 구가 교차하여 생기는 원의 최소 및 최대 zz좌표는 서로 적어도 0.010.01만큼 차이가 난다.

입력의 끝은 00 하나만 있는 줄로 표시된다.

출력

각 데이터셋에 대해 두 줄을 출력한다. 첫 줄에는 연결 도형 개수의 변화 횟수를 나타내는 정수 MM을 출력한다. 둘째 줄에는 그 변화들을 나타낸 MM비트 이진수를 출력한다. 즉 zz가 커지는 순서대로, 증가에는 11, 감소에는 00을 쓴다.

예제4

  1. 예제 1

    입력
    3
    95 20 180 18
    125 20 185 18
    40 27 195 10
    1
    5 5 5 4
    2
    5 5 5 4
    5 5 5 3
    2
    5 5 5 4
    5 7 5 3
    16
    2338 3465 29034 710
    1571 14389 25019 842
    1706 8015 11324 1155
    1899 4359 33815 888
    2160 10364 20511 1264
    2048 8835 23706 1906
    2598 13041 23679 618
    1613 11112 8003 1125
    1777 4754 25986 929
    2707 9945 11458 617
    1153 10358 4305 755
    2462 8450 21838 934
    1822 11539 10025 1639
    1473 11939 12924 638
    1388 8519 18653 834
    2239 7384 32729 862
    0
    
    예상 출력
    8
    11011000
    2
    10
    2
    10
    2
    10
    28
    1011100100110101101000101100
    
  2. 예제 2

    입력
    1
    50 50 40 30
    0
    
    예상 출력
    2
    10
    
  3. 예제 3

    입력
    2
    40 50 100 30
    95 50 103 30
    0
    
    예상 출력
    6
    110100
    
  4. 예제 4

    입력
    2
    50 50 40 20
    50 50 200 20
    0
    
    예상 출력
    4
    1010