시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 512 MB | 37 | 16 | 15 | 55.556% |
表に 0 以上 N − 1 以下の整数が 1 つ書かれたカードが 2 枚ずつある.あなたと JOI 君は,これら 2N 枚 のカードを用いて神経衰弱というゲームの練習をしている.
ゲームの練習を始める時点では,カードは裏向きの状態でテーブルに横一列に並べられている.左から i + 1 枚目 (0 ≦ i ≦ 2N − 1) のカードを,カード i と呼ぶ.カード i の表に書かれた整数を Ai (0 ≦ i ≦ 2N − 1) とする.最初,JOI 君とあなたには,Ai (0 ≦ i ≦ 2N − 1) がどのような値であるかは分からない. あなたと JOI 君は,以下のやりとりを K 回まで繰り返すことができる.
JOI 君にとっての整数の覚えやすさは,N 個の整数 P0, P1, . . . , PN−1 で表される.これらの整数は,以下 の 2 つの条件を満たす.
JOI 君にとって i が j よりも覚えやすいことは,Pi < Pj が成り立つことと同値である.
あなたの課題は,JOI 君と K 回以下のやりとりを行うことで,それぞれのカードに書かれた整数を特定 することである.ただし,あなたは,JOI 君にとっての整数の覚えやすさを表す整数 P0, P1, . . . , PN−1 がど のような値であるかを知らない.
JOI 君とやりとりを行って,それぞれのカードに書かれた整数を特定するプログラムを作成せよ.
あなたは,それぞれのカードに書かれた整数を特定する方法を実装した 1 個のプログラムを書かねばな らない.プログラムは Memory2_lib.h
をインクルードすること.
プログラムは,以下のルーチンを実装しなければならない.
void Solve(int T, int N)
Flip
を呼び出すことによってカードに書かれた整数を特定し,その内容を Answer を呼び出すことによって答えなければならない.プログラム中では以下の関数を呼び出すことができる.
int Flip(int I, int J)
I
, J
は,JOI 君がめくるカードの番号 I, Jである.Flip
を呼び出した場合は b となる.K
回を超えて呼び出した場合は 不正解 [2] となる.void Answer(int I, int J, int X)
X
が書かれたカードの番号を特定できたことを表す.I
, J
, X
は,以下の条件を満たしていなければならない.
これらを満たさない引数とともに Answer
を呼び出した場合は 不正解 [3] となる.
引数 X
は,以前のどの呼び出しにおける引数 X
とも異ならなければならない.これが満たされない場合は 不正解 [4] となる.
この関数は,ちょうど N 回呼び出さなければならない.これが満たされない場合は 不正解 [5] となる.
内部での使用のために他のルーチンを実装したり,グローバル変数を宣言したりするのは自由である.ただし,あなたの提出は標準入力・標準出力,あるいは他のファイルといかなる方法でもやりとりしてはならない.
採点プログラムのサンプルが読み込む入力の例と,それに対応するルーチンの呼び出しの例を以下に示す.
入力例 | ルーチンの呼び出しの例 | |
---|---|---|
呼び出し | 戻り値 | |
1 3 10000 0 1 2 1 0 2 0 1 2 |
Flip(0, 2) |
1 |
Flip(0, 4) |
1 |
|
Flip(1, 2) |
0 |
|
Answer(0, 4, 1) |
||
Flip(1, 3) |
0 |
|
Flip(5, 2) |
2 |
|
Flip(4, 5) |
1 |
|
Answer(1, 3, 0) |
||
Answer(5, 2, 2) |
この例での関数の呼び出しは,必ずしも意味のある呼び出しとは限らないことに注意せよ.
C++17, C++14, C++20, C++14 (Clang), C++17 (Clang), C++20 (Clang)