팡고른 숲

시간 제한3초메모리 제한128 MB

요약
사각형 중심과 적어도 한 그루의 나무를 지나는 직선 중 왼쪽 규칙으로 나무를 정확히 반씩 나누는 최소 각도 직선을 찾는다.
난이도

보통10점 중 7점

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

문제

엔트는 숲의 수호자다. 중간계에서 가장 나이가 많은 엔트인 나무수염은 자신이 지킬 나무와, 젊은 동료 엔트인 브레갈라드가 지킬 나무를 나누려고 한다.

두 엔트가 지키는 숲은 직사각형이며 숲 안의 나무는 짝수 그루다. 나무수염은 직선 하나를 그어 숲을 두 구역으로 나눈 뒤 한 구역은 자신이, 다른 구역은 브레갈라드가 맡으려 한다. 두 구역에 속한 나무의 수가 다르거나 넓이가 다르면 두 엔트는 몇 만 년 동안 다투게 되므로, 두 조건을 모두 공평하게 맞춰야 한다. 즉, 두 구역의 나무 수가 같고(각각 N/2N/2그루) 넓이도 같아야 한다.

경계선(직선) 위에 정확히 놓인 나무는 두 구역 중 어느 쪽에나 넣을 수 있지만, 양쪽에 동시에 넣을 수는 없다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스의 첫째 줄에 나무의 수 NN, 숲의 너비 WW, 숲의 높이 HH가 주어진다. 숲의 네 꼭짓점은 (0,0)(0,0), (W,0)(W,0), (0,H)(0,H), (W,H)(W,H)이다. 이어지는 NN개의 줄에 각 나무의 좌표 x yx\ y가 주어진다.

  • 2≤N≤5000002 \le N \le 500000, NN은 짝수
  • 2≤W,H≤100002 \le W, H \le 10000이고, WW와 HH가 동시에 짝수인 경우는 없다
  • 모든 좌표는 정수이며 0<x<W0 < x < W, 0<y<H0 < y < H를 만족한다
  • 같은 위치에 있는 나무는 없다

N=W=H=0N = W = H = 0인 줄이 나오면 입력이 끝난다. 이 줄은 처리하지 않는다.

출력

공평하게 나누는 방법은 여러 가지일 수 있으므로, 다음 규칙으로 유일하게 정한 답을 출력한다.

경계선은 항상 숲의 중심 (W2, H2)\left(\tfrac{W}{2},\ \tfrac{H}{2}\right)를 지난다. (중심을 지나는 직선은 언제나 직사각형의 넓이를 정확히 반으로 나눈다.) 경계선이 중심과 함께 적어도 한 그루의 나무를 지나도록 잡는다. 이 직선에 방향을 정하고, 직선의 왼쪽에 있는 나무들을 나무수염의 구역으로 삼는다. 여기서 '왼쪽'은 직선의 진행 방향에서 반시계 방향으로 90°90° 돌린 쪽을 뜻한다. 직선 위에 정확히 놓인 나무는 좌표 (x,y)(x, y)가 작은 것부터 차례로 나무수염 쪽에 넣어, 나무수염의 나무가 정확히 N/2N/2그루가 되도록 한다.

중심과 어떤 나무를 함께 지나면서 이렇게 양쪽을 각각 N/2N/2그루로 만들 수 있는 방향의 직선이 여러 개라면, 방향의 각도(양의 xx축에서 반시계 방향으로 잰 [0°,360°)[0°, 360°) 범위의 값)가 가장 작은 것을 고른다.

각 테스트 케이스마다 나무수염의 구역에 속한 N/2N/2그루의 좌표를, xx가 작은 순서로, xx가 같으면 yy가 작은 순서로 정렬하여 한 줄에 한 그루씩 x y 형식으로 출력한다.

예제1

  1. 예제 1

    입력
    2 5 6
    2 3
    3 3
    4 5 6
    1 5
    2 5
    3 5
    4 5
    4 10 11
    5 1
    5 2
    5 3
    5 4
    0 0 0
    
    예상 출력
    2 3
    1 5
    2 5
    5 1
    5 2