만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

숙제

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

요약
ask 호출을 N + N log2 N회 이하로 사용해 모든 학생이 YES라고 답하도록 질문 목록과 질문 순서를 찾습니다.
난이도

보통10점 중 6점

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

숙제

N명의 학생이 한 줄로 서 있고, 순서대로 s0,s1,⋯ ,sN−1s_0, s_1, \cdots, s_{N-1}이라고 부른다 (2≤N≤10002 \le N \le 1000).

각 학생에게 두 질문 중 하나를 해서 숙제를 했는지 확인할 수 있다.

  • Q1 (값은 0): "숙제를 끝냈습니까?"
  • Q2 (값은 1): "숙제에 늦었습니까?"

학교의 이상한 관습 때문에, "아니오"라고 답해야 하는 학생은 수업이 끝날 때까지 답을 망설인다. 이 학생이 "아니오"라고 답했다는 사실은 이미 알고 있다.

질문 q0,q1,⋯ ,qN−1q_0, q_1, \cdots, q_{N-1}을 준비하면 학생들이 순서대로 와서 답하고, 그동안 답을 기다려야 한다.

  • 즉, s0,s1,⋯ ,sM−1s_0, s_1, \cdots, s_{M-1}이 YES라고 답하고 sMs_M이 "아니오"라고 표현하면, YES는 MM개만 받는다.
  • s0,s1,⋯ ,sN−1s_0, s_1, \cdots, s_{N-1}이 모두 YES라고 답하면 YES를 NN개 받는다.

질문은 컴퓨터에 적어 온라인에 올린다. 모니터에 뜨는 것은 큰 YES 하나뿐이고, 얻을 수 있는 것은 답의 순서뿐이다.

온라인 시스템이 고장 나서 질문은 미리 정해진 순서 i0,i1,⋯ ,iN−1i_0, i_1, \cdots, i_{N-1}대로 출제된다.

  • 즉, q0,q1,⋯ ,qN−1q_0, q_1, \cdots, q_{N-1}을 입력하면 질문은 qi0,qi1,⋯ ,qiN−1q_{i_0}, q_{i_1}, \cdots, q_{i_{N-1}} 순서로 물어진다.

질문을 던지는 수업은 최대 ⌈N+Nlog⁡2N⌉\lceil N + N\log_2 N \rceil번까지 가질 수 있다.

함수 question을 작성한다.

  • 입력: 학생들의 상태와 순서를 담은 Student 객체
  • .n()은 학생 수 NN을 반환한다.
  • .ask(Q)는 질문 목록 Q를 바탕으로 'YES' 목록을 반환한다. Q는 길이가 NN이고 Q1과 Q2로 이루어진다. 반환 목록의 길이가 NN일 필요는 없다. 반환값은 ['YES' for j in range(M)] 형태이며, 여기서 MM은 YES의 개수이다: M=max⁡{m≤N∣j<m⟹sj는 Q[ij]에 YES라고 답한다}M = \max\{m \le N \mid j < m \Longrightarrow s_j \text{는 } Q[i_j] \text{에 YES라고 답한다}\}.

출력: NN개의 YES를 받는 입력 질문 목록 q0,q1,⋯ ,qN−1q_0, q_1, \cdots, q_{N-1}과 순서 i0,i1,⋯ ,iN−1i_0, i_1, \cdots, i_{N-1}. 전자는 컴퓨터에 입력하는 순서이고, 후자는 qiq_i가 물어지는 순서이다.

모든 학생이 숙제를 끝냈거나 늦었다고 가정하며, 수업이 진행되어도 상태는 바뀌지 않는다.

주의: 채점 코드에서는 Student의 보호 속성(protected attribute) 이름이 제출용 코드와 다르게 되어 있다.

예제1

  1. 예제 1

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