레이저 센서

일반 위치에 있는 N개의 파란 점과 2N개의 빨간 점이 주어질 때, 논문이 제시한 각도 정렬 기반 재귀 Solve/Attach 절차가 만드는 교차 없는 매칭을 그대로 구성한다.

어려움9분할 정복기하정렬재귀아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

정밀 측정 업체가 레이저로 멀리 떨어진 물체의 변화를 재는 장치를 여러 대 사서 서로 다른 장소에 설치했다. 장치마다 레이저 센서가 두 개 있고 센서 하나가 물체 하나를 재므로, 장치 한 대가 물체 두 개를 동시에 잰다. 서로 다른 두 장치에서 나온 레이저 빛이 만나면 서로 간섭해 측정 오류가 생기므로, 레이저 빛이 서로 교차하지 않게 구성한다.

설치한 장치의 위치를 평면 위의 파란점으로, 측정할 물체의 위치를 빨간점으로 나타내면 문제는 다음과 같다.

평면에 파란점 NN개와 빨간점 2N2N개가 있다. 다음 세 조건을 모두 만족하도록 점을 선분으로 이은 것을 연결 구성이라고 하자.

  • 파란점은 각각 빨간점 두 개와 선분으로 이어진다.
  • 빨간점은 각각 파란점 하나와 선분으로 이어진다.
  • 어떤 두 선분도 서로 교차하지 않는다.

그림의 (A)에는 파란점 3개와 빨간점 6개가 있다. 1번 파란점은 1번과 4번 빨간점에, 2번 파란점은 2번과 5번 빨간점에, 3번 파란점은 3번과 6번 빨간점에 이어져 있고 어떤 두 선분도 교차하지 않으므로 (A)는 연결 구성이다. (B)는 같은 점집합의 또 다른 연결 구성이다. 즉 입력 하나에 연결 구성이 여러 개 있을 수 있다. (C)에서는 1번 파란점과 3번 빨간점을 잇는 선분이 3번 파란점과 2번 빨간점을 잇는 선분과 교차하므로 (C)는 연결 구성이 아니다.

입력 하나에 연결 구성이 여러 개 있을 수 있으므로, 출력에 적힌 절차가 만드는 연결 구성 하나를 출력한다.

입력

첫째 줄에 파란점의 개수 NN이 주어진다 (1N1,0001 \le N \le 1{,}000). 다음 NN개 줄 가운데 ii번째 줄에 ii번 파란점의 x좌표와 y좌표가 주어진다. 이어지는 2N2N개 줄 가운데 jj번째 줄에 jj번 빨간점의 x좌표와 y좌표가 주어진다. 좌표는 모두 108-10^8 이상 10810^8 이하의 정수이다. 주어진 점 가운데 어떤 세 점도 한 직선 위에 있지 않다.

출력

NN개 줄을 출력한다. ii번째 줄에는 ii번 파란점과 이어진 두 빨간점의 번호를 작은 수부터 공백 하나로 구분해 출력한다.

연결 구성이 여러 개일 수 있으므로 다음 절차가 만드는 구성을 출력한다. 이 절차는 필요한 번호를 항상 찾고, 절차가 만드는 연결 구성은 항상 세 조건을 만족한다.

파란점의 값을 22, 빨간점의 값을 1-1이라 하고, 점 집합의 값을 그 집합에 속한 점의 값의 합이라고 하자. 주어진 점 3N3N개의 값은 00이다. 주어진 점 3N3N개 전체에 Solve를 실행한다.

Solve(SS), SS의 값은 00이다.

  1. SS가 비어 있으면 멈춘다.
  2. SS에서 y좌표가 가장 작은 점, 그런 점이 여럿이면 그중 x좌표가 가장 작은 점을 pp라고 하자. SS의 나머지 점을 pp에서 그 점으로 향하는 벡터의 각도가 커지는 순서로 q1,q2,,qmq_1, q_2, \dots, q_m이라고 하자. 각도는 x축의 양의 방향에서 반시계 방향으로 잰다. 이 각도는 모두 00 이상 π\pi 미만이고 서로 같은 값이 없다.
  3. W0=0W_0 = 0, Wi=Wi1+viW_i = W_{i-1} + v_i라고 하자. viv_iqiq_i의 값이다.
  4. pp가 파란점이면 Wk=1W_k = -1인 가장 작은 번호를 kk, Wl=2W_l = -2인 가장 작은 번호를 ll이라고 하자. ppqkq_k, qlq_l과 잇는다. 그다음 q1,,qk1q_1, \dots, q_{k-1}qk+1,,ql1q_{k+1}, \dots, q_{l-1}ql+1,,qmq_{l+1}, \dots, q_m에 각각 Solve를 실행한다.
  5. pp가 빨간점이면 Wk10W_{k-1} \le 0인 가장 큰 번호를 kk라고 하자. qkq_k는 파란점이다. ppqkq_k와 잇는다. Wk1=1W_{k-1} = -1이면 Attach(q1,,qk1q_1, \dots, q_{k-1}; qkq_k; pp)와 Solve(qk+1,,qmq_{k+1}, \dots, q_m)을 실행하고, 그렇지 않으면 Solve(q1,,qk1q_1, \dots, q_{k-1})과 Attach(qk+1,,qmq_{k+1}, \dots, q_m; qkq_k; pp)를 실행한다.

Attach(TT; cc; pp), TT는 비어 있지 않고 값이 1-1이며, 파란점 cc는 빨간점 하나를 더 이어야 하고, ppTT 밖의 점이다.

  1. TT의 점을 cc에서 pp로 향하는 반직선과 cc에서 그 점으로 향하는 반직선이 cc에서 이루는 각이 커지는 순서로 s1,s2,,sts_1, s_2, \dots, s_t라고 하자. 이 각은 모두 00보다 크고 π\pi보다 작으며 서로 같은 값이 없다.
  2. V0=0V_0 = 0, Vi=Vi1+uiV_i = V_{i-1} + u_i라고 하자. uiu_isis_i의 값이다.
  3. Vj10V_{j-1} \ge 0인 가장 큰 번호를 jj라고 하자. sjs_j는 빨간점이다. ccsjs_j와 잇는다. 그다음 s1,,sj1s_1, \dots, s_{j-1}sj+1,,sts_{j+1}, \dots, s_t에 각각 Solve를 실행한다.