아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

가장 가까운 원

시간 제한8초메모리 제한512 MB

요약
반지름이 최대 두 배까지만 차이 나는 100000개 이하의 겹치지 않는 원들이 주어질 때, 두 원 사이의 간격이 가장 작은 쌍을 찾아 그 거리를 출력한다.
난이도

어려움10점 중 8점

유형
분할 정복, 기하, 정렬, 이분 탐색
정답자
아직 제출이 없습니다

문제

xy평면에 서로 겹치지 않는 N개의 원이 주어진다. 각 원의 반지름은 다르지만, 가장 큰 원의 반지름이 가장 작은 원의 반지름의 두 배를 넘지는 않는다.

그림 1: 예제 입력

두 원 C1과 C2 사이의 거리는 다음과 같이 정의한다.

(x_1−x_2)2+(y_1−y_2)2−r_1−r_2\sqrt{(x\_1 - x\_2)^2 + (y\_1 - y\_2)^2} - r\_1 - r\_2

여기서 (xi, yi)는 원 Ci의 중심 좌표이고, ri는 Ci의 반지름이다 (i = 1, 2).

가장 가까운 두 원을 찾아 그 거리를 출력하는 프로그램을 작성하라.

입력

입력은 여러 개의 테스트 케이스로 이루어지며, 마지막에 0 하나만 있는 줄이 주어지면 입력이 끝난다.

각 테스트 케이스의 첫 줄에는 원의 개수 N (2 ≤ N ≤ 100000)이 주어진다. 이어서 N개의 줄에 각 원을 나타내는 세 실수 R, X, Y가 주어진다. R은 원의 반지름, X와 Y는 각각 원의 중심의 x좌표와 y좌표이다.

출력

각 테스트 케이스마다 가장 가까운 두 원 사이의 거리를 출력한다. 소수점 아래 자릿수는 얼마든지 좋지만, 오차가 0.00001을 넘어서는 안 된다.

예제1

  1. 예제 1

    입력
    4
    1.0 0.0 0.0
    1.5 0.0 3.0
    2.0 4.0 0.0
    1.0 3.0 4.0
    0
    
    예상 출력
    0.5