아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

룩 배치

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

요약
각 로크마다 주어진 직사각형 안에 행과 열이 겹치지 않도록 n개의 로크를 배치하고, 가능하면 사전순으로 가장 작은 배치를 출력한다.
난이도

어려움10점 중 8점

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

문제

n×nn \times n 크기의 체스판(1≤n≤30001 \le n \le 3000)에 룩 nn개를 놓으려고 합니다. 배치는 다음 규칙을 만족해야 합니다.

  • 각 i=1,…,ni = 1, \dots, n에 대해 ii번 룩은 두 꼭짓점 (ai,bi)(a_i, b_i)와 (ci,di)(c_i, d_i)로 주어지는 직사각형 안에 놓여야 합니다. 여기서 (ai,bi)(a_i, b_i)는 직사각형의 왼쪽 위 칸(행, 열)이고 (ci,di)(c_i, d_i)는 오른쪽 아래 칸이며, 1≤ai≤ci≤n1 \le a_i \le c_i \le n, 1≤bi≤di≤n1 \le b_i \le d_i \le n입니다. 체스판의 왼쪽 위 칸은 (1,1)(1, 1), 오른쪽 아래 칸은 (n,n)(n, n)입니다. 즉 ii번 룩이 놓이는 칸의 행은 [ai,ci][a_i, c_i], 열은 [bi,di][b_i, d_i] 범위 안에 있어야 합니다.
  • 어떤 두 룩도 서로 공격할 수 없습니다. 즉 두 룩이 같은 행이나 같은 열에 놓일 수 없습니다.

모든 룩을 각자의 직사각형 안에, 서로 공격하지 않도록 놓을 수 있는지 판단하고, 가능하다면 그러한 배치 하나를 출력하세요.

입력

첫 번째 줄에 정수 nn(1≤n≤30001 \le n \le 3000)이 주어집니다. 이어지는 nn개의 줄에는 각각 네 정수 aia_i, bib_i, cic_i, did_i가 공백 하나로 구분되어 주어지며, ii번 룩의 직사각형을 나타냅니다(1≤ai≤ci≤n1 \le a_i \le c_i \le n, 1≤bi≤di≤n1 \le b_i \le d_i \le n, 모든 값은 11 이상 nn 이하).

출력

유효한 배치가 존재하지 않으면 NIE(폴란드어로 "아니오") 한 단어만 출력합니다.

그렇지 않으면 nn개의 줄을 출력합니다. ii번째 줄에는 ii번 룩의 행과 열을 공백 하나로 구분해 출력하며, 행은 [ai,ci][a_i, c_i], 열은 [bi,di][b_i, d_i] 범위 안에 있어야 합니다. 룩은 입력에서 직사각형이 주어진 순서와 같은 순서로 출력합니다.

유효한 배치가 여러 개일 수 있으므로 사전순으로 가장 작은 배치를 출력합니다. 두 배치는 값을 순서대로 나열한 수열, 즉 1번 룩의 행, 1번 룩의 열, 2번 룩의 행, 2번 룩의 열, 이런 순서로 비교합니다. 다시 말해 1번 룩의 행을 가능한 한 작게, 그다음 그 열을 가능한 한 작게, 그다음 2번 룩의 행, 그다음 그 열을 작게 하는 식으로 최소화합니다.

예제3

  1. 예제 1

    입력
    4
    1 1 1 1
    1 3 2 4
    3 1 4 2
    2 2 4 4
    
    예상 출력
    1 1
    2 3
    3 2
    4 4
    
  2. 예제 2

    입력
    1
    1 1 1 1
    
    예상 출력
    1 1
    
  3. 예제 3

    입력
    2
    1 1 2 2
    1 1 1 1
    
    예상 출력
    2 2
    1 1