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

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

상자들의 습격

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

요약
원점에서 발사된 레이저가 축에 평행한 상자들을 만나 부수고 반사되는 과정을 시뮬레이션해 파괴 순서를 출력한다.
난이도

보통10점 중 6점

유형
기하, 시뮬레이션, 구현
정답자
아직 제출이 없습니다

문제

상자 떼가 당신을 공격하고 있습니다. 상자는 모두 NN개 (0≤N≤10000 \le N \le 1000)이며, 각 상자는 변이 좌표축과 평행한 축 정렬 직사각형입니다. 당신에게는 방어 수단으로 거대한 레이저가 있습니다.

레이저는 원점에 놓여 있고, 정해진 한 방향으로 광선 하나를 발사합니다. 광선이 어떤 상자에 닿으면 그 상자를 파괴하고 그 상자에서 반사됩니다.

반사 규칙은 광선이 상자에 처음 닿는 위치에 따라 정해집니다.

  • 첫 교점이 상자의 수평 변 위에 있으면, 광선 방향의 수직 성분이 반대로 바뀝니다.
  • 첫 교점이 상자의 수직 변 위에 있으면, 수평 성분이 반대로 바뀝니다.
  • 광선이 상자의 모서리(수평 변과 수직 변이 만나는 점)에 처음 닿으면, 수평 성분과 수직 성분이 모두 반대로 바뀝니다.

파괴된 상자는 사라지므로, 광선은 그 뒤로 그 상자가 있던 자리를 자유롭게 통과할 수 있습니다.

파괴되는 상자들의 번호를 파괴되는 순서대로 출력하세요.

어떤 두 상자도 공통점을 갖지 않으며, 어떤 상자도 원점을 내부나 경계에 포함하지 않음이 보장됩니다.

입력

첫째 줄에 상자의 개수 NN이 주어집니다.

둘째 줄에 두 정수 dxdx와 dydy (−1000≤dx,dy≤1000-1000 \le dx, dy \le 1000, 둘이 동시에 00은 아님)가 주어집니다. 아무 방해가 없을 때 원점에서 발사된 광선은 점 (dx,dy)(dx, dy)를 지납니다.

이어지는 NN개의 줄에는 각각 네 정수 xix_i, yiy_i, wiw_i, hih_i (−1000≤xi,yi≤1000-1000 \le x_i, y_i \le 1000, 1≤wi,hi≤10001 \le w_i, h_i \le 1000)가 주어지며, 이는 ii번째 상자를 나타냅니다. 이 상자의 왼쪽 아래 꼭짓점은 (xi,yi)(x_i, y_i)이고 오른쪽 위 꼭짓점은 (xi+wi,yi+hi)(x_i + w_i, y_i + h_i)입니다. 상자에는 입력 순서대로 11번부터 NN번까지 번호가 매겨집니다.

출력

파괴되는 상자의 개수를 kk (k≥0k \ge 0)라고 합시다. kk개의 줄을 출력하며, ii번째 줄에는 ii번째 반사에서 파괴되는 상자의 번호를 출력합니다. k=0k = 0이면 아무것도 출력하지 않습니다.

예제5

  1. 예제 1

    입력
    3
    1 -1
    1 0 90 20
    1 -22 90 20
    1 -44 90 20
    
    예상 출력
    2
    1
    3
    
  2. 예제 2

    입력
    1
    1 0
    10 -3 5 6
    
    예상 출력
    1
    
  3. 예제 3

    입력
    1
    0 1
    -5 10 10 8
    
    예상 출력
    1
    
  4. 예제 4

    입력
    1
    1 1
    10 10 10 10
    
    예상 출력
    1
    
  5. 예제 5

    입력
    4
    1 1
    8 10 10 10
    19 -10 10 10
    26 10 14 10
    36 -10 14 10
    
    예상 출력
    1
    2
    3
    4