BOJ 21340 Dragon Balls
BOJ 21340 Dragon Balls
문제 내용
평면상에 개의 점이 있습니다 (). 각 점의 , 좌표는 각각 이상 이하인 정수입니다. 당신은 다음의 쿼리를 최대 1000번 사용하여 7개의 점을 모두 찾아 제거해야 합니다.
x y(): 평면상의 점 중에서 에 가장 가까운 점과의 거리의 제곱을 측정합니다. 이 쿼리의 결과가 0일 경우, 에 점이 있다는 뜻이며, 이 점은 제거됩니다.
인터랙션
먼저 점의 개수 이 주어집니다. 당신의 프로그램은 쿼리할 위치의 좌표와 좌표를 순서대로 한 줄에 출력하고 flush해야 합니다. 그러면 그 위치에서 가장 가까운 점과의 거리의 제곱 ()를 입력으로 받을 수 있습니다.
의 값을 갖는 응답을 번 받았다면 당신의 프로그램은 즉시 종료되어야 합니다. 개의 점의 좌표는 모두 서로 다릅니다.
문제 풀이
스포일러
이 문제는 다양한 풀이가 있습니다.
- 적당한 와 에 대해 와 을 쿼리합니다. 높은 확률로 두 위치에서 가장 가까운 점은 서로 같습니다. 그러면 그 점의 좌표는 방정식을 풀어서 구하면 됩니다.
- 위와 비슷한 방법으로, 서로 비슷한 개의 위치를 쿼리합니다. 비둘기집의 원리에 의해, 두 쿼리의 결과는 반드시 서로 같은 점을 가리킵니다.
- 원호 위에 격자점이 아주 많지 않음을 이용하여, 한 점을 쿼리한 뒤에 해당 원 위의 격자점을 모두 시도해 봅니다. 이 방법은 사분원 위에 384개의 격자점을 갖는 경우가 존재하므로, 최악의 경우를 만났다면 다른 위치를 중심으로 다시 선정하여 재시도해야 합니다.
- 전체 영역을 사분면으로 나누어, 각 사분면의 중심을 쿼리합니다. 그 중에서 거리가 가장 작은 사분면 안에 점이 적어도 하나 존재하므로, 그 영역으로 좁히기를 반복하는 일종의 2D 이분 탐색을 할 수 있습니다.
Last updated on