위치 복원하기

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

요약
x_1 = 0이고 좌표가 모두 다르다는 사실만 알고, 두 점 사이 거리 질문을 floor(3N/2)번 이하로 써서 N개의 정수 좌표를 복원한다.
난이도

어려움10점 중 8점

유형
분할 정복, 구간, 수학, 구현
정답자
아직 제출이 없습니다

문제

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

수직선 상에 NN개의 서로 다른 정수 좌표 x_1,x_2,⋯ ,x_Nx\_1, x\_2, \cdots, x\_N이 존재한다. 여러분은 이 값을 알지 못하며, x_1=0<x_2x\_1 = 0 < x\_2이고 모든 x_ix\_i가 ∣x_i∣≤109|x\_i| \le 10^9를 만족한다는 사실만 알고 있다.

채점기에 다음 질문을 ⌊32N⌋\lfloor\frac{3}{2}N\rfloor번 이하로 하여 x_1,x_2,⋯ ,x_Nx\_1, x\_2, \cdots, x\_N을 복원하자.

  • ? ii jj: x_i,x_jx\_i, x\_j에 대해 ∣x_i−x_j∣|x\_i - x\_j|를 질문한다.

입력

첫 번째 줄에 테스트 케이스의 개수 TT가 주어진다. (1≤T≤500)(1 \le T \le 500)

각 테스트 케이스의 시작에 정수 좌표의 개수를 나타내는 정수 NN이 주어진다. (2≤N≤1,000)(2 \le N \le 1\\,000)

모든 테스트 케이스에 대한 NN의 총합은 1,0001\\,000을 넘지 않는다.

출력

여러분은 다음 두 가지 유형의 질문을 채점기에 할 수 있다.

  • ? ii jj

    • x_i,x_jx\_i, x\_j에 대해 ∣x_i−x_j∣|x\_i - x\_j|를 질문한다. (1≤i<j≤N(1 \leq i < j \leq N, i,ji, j는 정수))
    • 이 유형의 질문은 최대 ⌊32N⌋\lfloor\frac{3}{2}N\rfloor번 할 수 있다.
  • ! x_1x\_1 x_2x\_2 ⋯\cdots x_Nx\_N

    • x_1,x_2,⋯ ,x_Nx\_1, x\_2, \cdots, x\_N이 정답인지 질문한다. (∣x_i∣≤109(|x\_i| \le 10^9, x_ix\_i는 정수))
    • 별도의 반환값은 없고, 출력이 정답과 불일치한다면 틀렸습니다 판정을 받는다.
    • 출력이 정답과 일치하며 남은 테스트 케이스가 있다면 다음 테스트 케이스의 인터랙션이 이어서 진행된다.
    • 출력이 정답과 일치하며 남은 테스트 케이스가 없다면 맞았습니다!! 판정을 받는다.

모든 출력 이후에는 반드시 표준 출력 버퍼를 flush해야 한다. 언어 별로 표준 출력 버퍼를 flush하는 방법은 다음과 같다.

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

기타 언어의 경우 각 언어의 documentation을 참조하자.

출력 형식을 지키지 않거나 첫 번째 유형의 질문을 ⌊32N⌋\lfloor\frac{3}{2}N\rfloor번 초과로 한 경우에는 예상치 못한 채점 결과를 받을 수 있음에 유의하자.

모든 테스트 케이스를 해결한 뒤 프로그램은 즉시 종료되어야 한다.

예제2

  1. 예제 1

    입력
    1
    3
     
    3
     
    1
     
    4
     
    
    예상 출력
     
     
    ? 1 2
     
    ? 1 3
     
    ? 2 3
     
    ! 0 3 -1
    
  2. 예제 2

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