No title

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

요약
절댓값이 1 이상 10 이하인 0이 아닌 정수 수열이 숨겨져 있을 때, 두 원소의 합 또는 곱의 부호를 묻는 질문을 N번 이하로 사용해 모든 원소의 부호를 알아낸다.
난이도

보통10점 중 7점

유형
구현, 수학, 그리디
정답자
아직 제출이 없습니다

문제

이 문제는 인터랙티브 문제이다.

모든 원소의 절댓값이 11 이상 1010 이하의 정수인 길이 NN의 수열 A_1A\_1, A_2A\_2, ⋯\cdots, A_NA\_N이 있다. 당신은 AA의 원소들을 모르지만, 인터랙터에게 두 원소의 합 또는 곱의 부호를 질문할 수 있다.

NN번 이하의 질문을 통해 모든 원소의 부호를 알아내 보자.

출력

당신의 프로그램은 아래의 과정을 통해 표준 입출력으로 인터랙터와 상호작용을 해야 한다. 이 문제의 인터랙터는 비적응적이다.

첫째 줄에 수열의 길이 NN이 주어진다. (3≤N≤1,000)(3 \leq N \leq 1\\,000)

인터랙터에게 다음과 같은 질문을 최대 NN번 할 수 있다.

  • ? i op j: opop가 +라면 A_i+A_jA\_i + A\_j, *라면 A_i×A_jA\_i \times A\_j의 부호를 질문한다. (1≤i<j≤N;(1 \leq i < j \leq N; op∈+,\*)op \in \\{+, \*\\})

각 질문은 한 줄에 출력하며, 각 줄의 마지막에 개행 문자를 출력한 뒤 표준 출력 버퍼를 비워야 한다.

각 질문 이후, 결과에 따라 한 줄에 문자 한 개가 주어진다. 계산한 값이 음수라면 -, 00이라면 0, 양수라면 +가 주어진다.

만약 모든 원소의 부호를 알아냈을 경우, 다음을 한 줄에 공백으로 구분하여 출력한다.

  • ! s_1s\_1 s_2s\_2 ⋯\cdots s_Ns\_N: A_iA\_i가 음수라면 s_is\_i는 -, 양수라면 +이다.

답을 출력한 뒤에는 개행 이후 표준 출력 버퍼를 비우고 프로그램을 즉시 종료해야 한다.

다음과 같은 경우에는 예상하지 못한 채점 결과를 받을 수 있음에 유의한다.

  • 매 질문이나 답을 출력한 뒤 표준 출력 버퍼를 비우지 않았다.
  • 출력 형식을 어겼다.
  • NN번보다 많은 질문을 했다.
  • 올바르지 않은 답을 출력했다.
  • 답을 출력한 이후 프로그램을 즉시 종료하지 않았다.

힌트

언어별로 표준 출력 버퍼를 비우는 방법은 다음과 같다.

  • C: fflush(stdout)
  • C++: std::cout << std::flush
  • Java: System.out.flush()
  • Python: sys.stdout.flush()

예제1

  1. 예제 1

    입력
    4
    
    +
    
    +
    
    -
    
    예상 출력
    
    ? 1 + 2
    
    ? 2 * 3
    
    ? 3 + 4
    
    ! + - - +