시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 512 MB37161555.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 回まで繰り返すことができる.

  1. あなたは,2N 枚のカードのうちの 2 枚のカードを指定する.
  2. JOI 君は,指定された 2 枚のカードをめくり,表に書かれた整数をあなたに見えないようにこっそり 見る.もし,2 枚のカードの表に書かれた整数が等しい場合は,その値を覚えてあなたに伝える.そ うでない場合は,表に書かれている整数のうち JOI 君が覚えやすい方の整数を覚えてあなたに伝える.

JOI 君にとっての整数の覚えやすさは,N 個の整数 P0, P1, . . . , PN−1 で表される.これらの整数は,以下 の 2 つの条件を満たす.

  • 0 ≦ Pi ≦ N − 1 (0 ≦ i ≦ N − 1).
  • Pi ≠ Pj (0 ≦ i < j ≦ N − 1).

JOI 君にとって i が j よりも覚えやすいことは,Pi < Pj が成り立つことと同値である.

あなたの課題は,JOI 君と K 回以下のやりとりを行うことで,それぞれのカードに書かれた整数を特定 することである.ただし,あなたは,JOI 君にとっての整数の覚えやすさを表す整数 P0, P1, . . . , PN−1 がど のような値であるかを知らない.

JOI 君とやりとりを行って,それぞれのカードに書かれた整数を特定するプログラムを作成せよ.

구현

あなたは,それぞれのカードに書かれた整数を特定する方法を実装した 1 個のプログラムを書かねばな らない.プログラムは Memory2_lib.h をインクルードすること.

プログラムは,以下のルーチンを実装しなければならない.

  • void Solve(int T, int N)
    このルーチンは,各テストケースに対し 1 回だけ呼び出される.引数 T は小課題の番号を表し,N は カードが 2N 枚あることを表す.
    このルーチンは,Flip を呼び出すことによってカードに書かれた整数を特定し,その内容を Answer を呼び出すことによって答えなければならない.

プログラム中では以下の関数を呼び出すことができる.

  • int Flip(int I, int J)
    この関数は,JOI 君にカードを指定する際に呼び出す.引数 I, J は,JOI 君がめくるカードの番号 I, Jである.
    I と J はともに 0 以上 2N − 1 以下の互いに異なる整数でなければならない.これを満たさない引数とともに Flip を呼び出した場合は b となる.
    この関数は,整数 AI と整数 AJ が等しい場合はその値を,そうでない場合は整数 AI と整数 AJ のうち JOI 君にとって覚えやすい方の値を返す.
    この関数を K 回を超えて呼び出した場合は 不正解 [2] となる.
  • void Answer(int I, int J, int X)
    この関数は,表に整数 X が書かれたカードの番号を特定できたことを表す.
    引数 I, J, X は,以下の条件を満たしていなければならない.
    • 0 ≦ I ≦ 2N − 1.
    • 0 ≦ J ≦ 2N − 1.
    • I ≠ J.
    • AI = AJ = X.

これらを満たさない引数とともに Answer を呼び出した場合は 不正解 [3] となる.

引数 X は,以前のどの呼び出しにおける引数 X とも異ならなければならない.これが満たされない場合は 不正解 [4] となる.

この関数は,ちょうど N 回呼び出さなければならない.これが満たされない場合は 不正解 [5] となる.

内部での使用のために他のルーチンを実装したり,グローバル変数を宣言したりするのは自由である.ただし,あなたの提出は標準入力・標準出力,あるいは他のファイルといかなる方法でもやりとりしてはならない.

제한

  • 1 ≦ N ≦ 50.
  • 0 ≦ Pi ≦ N − 1 (0 ≦ i ≦ N − 1).
  • Pi ≠ Pj (0 ≦ i < j ≦ N − 1).
  • 0 ≦ Ai ≦ N − 1 (0 ≦ i ≦ 2N − 1).
  • どの x (0 ≦ x ≦ N − 1) に対しても,Ai = x を満たす i (0 ≦ i ≦ 2N − 1) はちょうど 2 つある.

서브태스크 1 (10점)

  • T = 1.
  • K = 10 000.
  • Pi = i (0 ≦ i ≦ N − 1).

서브태스크 2 (50점)

  • T = 2.
  • K = 400.
  • Pi = i (0 ≦ i ≦ N − 1).

서브태스크 3 (40점)

  • T = 3.
  • K = 300.

예제

採点プログラムのサンプルが読み込む入力の例と,それに対応するルーチンの呼び出しの例を以下に示す.

入力例 ルーチンの呼び出しの例
呼び出し 戻り値
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)

채점 및 기타 정보

  • 예제는 채점하지 않는다.