만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

지지 여부

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

요약
3차원 공간의 n개 구가 주어질 때, 모든 쌍의 구 사이 거리 중 가장 작은 k개를 찾아 올림한 값으로 출력합니다.
난이도

어려움10점 중 8점

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

문제

3차원 공간에 nn개의 구가 있다. 구는 1,2,…,n1, 2, \ldots, n번으로 번호가 매겨져 있다. ii번 구의 중심은 (xi,yi,zi)(x_i, y_i, z_i)이고, 반지름은 rir_i이다.

두 구 ii와 jj 사이의 거리는 다음과 같이 정의한다.

d(i,j)=max⁡(0,(xi−xj)2+(yi−yj)2+(zi−zj)2−ri−rj)d(i,j) = \max\left(0, \sqrt{(x_i-x_j)^2 + (y_i-y_j)^2 + (z_i-z_j)^2} - r_i - r_j\right)

즉, 구 ii의 내부 또는 표면에 있는 점 PP와 구 jj의 내부 또는 표면에 있는 점 QQ를 고를 때, PP와 QQ 사이 유클리드 거리의 최솟값이 d(i,j)d(i,j)이다.

1≤i<j≤n1 \le i < j \le n을 만족하는 쌍 (i,j)(i, j)는 n(n−1)2\frac{n(n-1)}{2}개이다. 이 모든 쌍에 대한 d(i,j)d(i,j) 값 중 가장 작은 kk개를 구하라.

입력

첫 줄에 테스트 케이스의 수 TT (1≤T≤31 \le T \le 3)가 주어진다.

각 테스트 케이스의 첫 줄에는 두 정수 nn과 kk (2≤n≤100 0002 \le n \le 100\,000, 1≤k≤min⁡(300,n(n−1)2)1 \le k \le \min\left(300, \frac{n(n-1)}{2}\right))가 주어진다.

이어지는 nn개의 줄에는 ii번째 구를 나타내는 네 정수 xix_i, yiy_i, ziz_i, rir_i (0≤xi,yi,zi≤1060 \le x_i, y_i, z_i \le 10^6, 1≤ri≤1061 \le r_i \le 10^6)가 주어진다.

출력

각 테스트 케이스마다 kk개의 줄을 출력한다. 각 줄에는 가장 작은 kk개의 d(i,j)d(i,j) 값을 오름차순으로 한 줄에 하나씩, 올림한 값 ⌈d(i,j)⌉\lceil d(i,j) \rceil로 출력한다. 예를 들어 ⌈5⌉=5\lceil 5 \rceil = 5이고 ⌈5.1⌉=6\lceil 5.1 \rceil = 6이다.

예제1

  1. 예제 1

    입력
    1
    4 6
    0 0 0 1
    0 3 2 2
    3 2 1 1
    1 1 2 2
    
    예상 출력
    0
    0
    0
    1
    1
    2