막대기 줍기

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

요약
던진 순서대로 주어진 선분 중에서 나중에 던진 선분과 교차하지 않는 선분을 모두 찾아 출력한다.
난이도

보통10점 중 7점

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

문제

스탠(Stan)에게 길이가 서로 다른 막대기 nn개가 있다. 그는 막대기를 한 번에 하나씩 아무렇게나 바닥에 던진다. 막대기는 매우 얇아서 두께는 무시할 수 있다.

던지기를 모두 끝낸 뒤, 스탠은 맨 위에 있는 막대기(top stick), 즉 그 위에 다른 막대기가 하나도 놓여 있지 않은 막대기들을 찾으려고 한다. 막대기 BB가 막대기 AA보다 나중에 던져졌고 두 막대기가 서로 교차하면(끝점에서 닿는 경우도 교차로 본다), 막대기 BB는 막대기 AA 위에 놓인 것으로 본다. 어떤 막대기든, 자신보다 나중에 던져진 막대기 중 자신과 교차하는 것이 하나도 없으면 그 막대기는 맨 위 막대기다.

가장 마지막에 던진 막대기는 항상 맨 위에 있다. 맨 위에 있는 모든 막대기를 찾아라.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 케이스의 첫 줄에는 막대기의 개수 nn (1≤n≤100000)(1 \le n \le 100000)이 주어진다. 이어지는 nn개의 줄에는 각각 네 개의 실수 x1 y1 x2 y2x_1\ y_1\ x_2\ y_2가 주어지며, 이는 막대기 하나의 두 끝점의 평면 좌표이다. 막대기는 스탠이 던진 순서대로 나열되어 있다. 맨 위에 있는 막대기는 10001000개를 넘지 않는다고 가정해도 된다.

입력은 n=0n = 0인 케이스로 끝나며, 이 케이스는 처리하지 않는다.

출력

각 테스트 케이스마다, 맨 위에 있는 막대기들을 던진 순서대로 한 줄에 출력한다. 출력 형식은 다음과 같다.

Top sticks: a, b, c.

즉, Top sticks: 뒤에 맨 위 막대기의 번호를 던진 순서대로 , (쉼표와 공백)로 구분해 나열하고, 줄 끝에 마침표 .를 붙인다. 막대기는 입력에 주어진 순서대로 1,2,…,n1, 2, \dots, n번으로 번호가 매겨진다.

예제1

  1. 예제 1

    입력
    5
    1 1 4 2
    2 3 3 1
    1 -2.0 8 4
    1 4 8 2
    3 3 6 -2.0
    3
    0 0 1 1
    1 0 2 1
    2 0 3 1
    0
    
    예상 출력
    Top sticks: 2, 4, 5.
    Top sticks: 1, 2, 3.