No.1830 Balanced Majority
レベル :  / 実行時間制限 : 1ケース 2.000秒 / メモリ制限
            : 512 MB / リアクティブ問題 (詳しくはこちら)
            
タグ : / 解いたユーザー数 73
作問者 : riano
            
            / テスター :
riano
            
            / テスター :
            
             chineristAC
            
            👑
chineristAC
            
            👑  ygussany
ygussany
            
            
        
        
        タグ : / 解いたユーザー数 73
作問者 :
 riano
            
            / テスター :
riano
            
            / テスター :
            
            問題文最終更新日: 2022-01-23 18:54:04
        
        
            コンテストの他の問題:
            
        
        
        問題文
        
        この問題はインタラクティブ形式です。
        
        $N$ 枚のカードが積み上げられた山札があります。ただし、$N$ は偶数とします。
山札の中のカードは表裏バラバラな状態ですが、全体で $N/2$ 枚(ちょうど半分)が表向きであることが分かっています。
これから $20$ 回以下の任意の回数、下記の形式の質問を行うことで
- 山札の中で連続している「$N/2$ 枚以上 $N$ 枚未満」のカードの組であって、含まれる表向きのカードの枚数と裏向きのカードの枚数が等しいもの
【質問の形式】
$1\leq K\leq N$ を満たす任意の整数 $K$ を毎回好きに選び、「山札の上から $K$ 枚目までに含まれる表向きのカードの枚数」を尋ねる。
制約
- $4\leq N\leq 2\times 10^5$
- $N$ は偶数である
- 入力は全て整数である
入出力
最初の入力$N$
質問を行う場合の出力
$?$ $K$$1\leq K\leq N$ である必要があり、質問は各テストケースごとに $20$ 回以下である必要があります。
質問に対しての返答の入力
$S$ただし $S$ は、質問された $K$ に対する「山札の上から数えて $K$ 枚目までのカードの中で表向きであるものの枚数」です。 また、質問が不正あるいは $20$ 回を超過した場合には $-1$ が入力されます。この場合、直ちにプログラムを終了してください。
回答を行う際の出力
$!$ $L$ $R$山札の中で上から数えて $L$ 枚目から $R$ 枚目までのカードの組(両端を含む)が条件を満たす組であると判明したとき、上記のように答えてください。 ただし $1\leq L \leq R\leq N$ である必要があります。
全ての出力に対して、最後に flush してください。そうでない場合、ジャッジの結果は不定です。 また、各記号および数字の間は空白で区切るようにしてください。
入出力のコード例( C++ / Python / C ): クリックで展開
C++
#include <bits/stdc++.h>
using namespace std;
int main() {
    //入力
    int N; cin >> N;
    
    //質問
    int K = N,S;
    cout << "? " << K << endl;
    cin >> S;
    
    //回答
    int L = 1,R = N;
    cout << "! " << L << " " << R << endl;
}
            
        Python
import sys
##入力
N = int(input())
##質問
K = N
print("? {}".format(K))
sys.stdout.flush()
S = int(input())
##回答
L = 1; R = N
print("! {} {}".format(L,R))
sys.stdout.flush()
            
        C
#include <stdio.h>
int main(){
    //入力
    int N;
    scanf("%d", &N);
	
    //質問
    int K = N,S;
    printf("? %d\n", K);
    fflush(stdout);
    scanf("%d", &S);
	
    //回答
    int L = 1,R = N;
    printf("! %d %d\n", L, R);
    fflush(stdout);
}
            
        サンプル
サンプル1
以下のようなやり取りが考えられます。
| 入力 | 出力 | 説明 | 
|---|---|---|
| 6 | $N=6$ | |
| ? 1 | $K=1$ で質問 | |
| 1 | $1$ 枚目までに含まれる表向きのカードは $1$ 枚 | |
| ? 2 | $K=2$ で質問 | |
| 2 | $2$ 枚目までに含まれる表向きのカードは $2$ 枚 | |
| ? 3 | $K=3$ で質問 | |
| 2 | $3$ 枚目までに含まれる表向きのカードは $2$ 枚 | |
| ? 4 | $K=4$ で質問 | |
| 2 | $4$ 枚目までに含まれる表向きのカードは $2$ 枚 | |
| ! 1 4 | $1$ 枚目から $4$ 枚目の組が条件を満たすと回答 | 
なお、$2,3$ 枚目や $1,2,3,4,5,6$ 枚目といった組は枚数の条件に反するため誤答となります。
提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。
