BOJ 21340 Dragon Balls

BOJ 21340 Dragon Balls

문제 링크:

문제 내용

평면상에 nn개의 점이 있습니다 (1n71 \le n \le 7). 각 점의 xx, yy좌표는 각각 00 이상 10610^6 이하인 정수입니다. 당신은 다음의 쿼리를 최대 1000번 사용하여 7개의 점을 모두 찾아 제거해야 합니다.

  • x y (0x,y1060 \le x, y \le 10^6): 평면상의 점 중에서 (x,y)(x, y)에 가장 가까운 점과의 거리의 제곱을 측정합니다. 이 쿼리의 결과가 0일 경우, (x,y)(x, y)에 점이 있다는 뜻이며, 이 점은 제거됩니다.

인터랙션

먼저 점의 개수 nn이 주어집니다. 당신의 프로그램은 쿼리할 위치의 xx좌표와 yy좌표를 순서대로 한 줄에 출력하고 flush해야 합니다. 그러면 그 위치에서 가장 가까운 점과의 거리의 제곱 dd (0d2×10120 \le d \le 2 \times 10^{12})를 입력으로 받을 수 있습니다.

00의 값을 갖는 응답을 nn번 받았다면 당신의 프로그램은 즉시 종료되어야 합니다. nn개의 점의 좌표는 모두 서로 다릅니다.

문제 풀이

스포일러

이 문제는 다양한 풀이가 있습니다.

  • 적당한 xxyy에 대해 (x,y)(x, y)(x,y+1)(x, y+1)을 쿼리합니다. 높은 확률로 두 위치에서 가장 가까운 점은 서로 같습니다. 그러면 그 점의 좌표는 방정식을 풀어서 구하면 됩니다.
  • 위와 비슷한 방법으로, 서로 비슷한 n+1n+1개의 위치를 쿼리합니다. 비둘기집의 원리에 의해, 두 쿼리의 결과는 반드시 서로 같은 점을 가리킵니다.
  • 원호 위에 격자점이 아주 많지 않음을 이용하여, 한 점을 쿼리한 뒤에 해당 원 위의 격자점을 모두 시도해 봅니다. 이 방법은 사분원 위에 384개의 격자점을 갖는 경우가 존재하므로, 최악의 경우를 만났다면 다른 위치를 중심으로 다시 선정하여 재시도해야 합니다.
  • 전체 영역을 사분면으로 나누어, 각 사분면의 중심을 쿼리합니다. 그 중에서 거리가 가장 작은 사분면 안에 점이 적어도 하나 존재하므로, 그 영역으로 좁히기를 반복하는 일종의 2D 이분 탐색을 할 수 있습니다.
Last updated on