QOJ.ac

QOJ

Time Limit: 1.0 s Memory Limit: 256 MB Total points: 100

#12104. Xoractive

Statistics

Aidos はパズルを考案し、Temirulan にその解決を挑みました。彼は $1$ から $n$ までの番号が付けられた、$n$ 個の相異なる非負整数からなる数列 $a = a_1, a_2, \dots, a_n$ を選びました。

Temirulan は以下の2種類の質問をすることができます。

  • ask — 与えられた数列の $i$ 番目の位置にある数値を明らかにします。
  • get_pairwise_xor — 相異なる整数の数列 $i_1, i_2, \dots, i_k$ に対して、数列 $a$ のインデックス $i_1, i_2, \dots, i_k$ にある要素のペアの XOR 値の集合 $\{a_{i_x} \oplus a_{i_y} \mid 1 \leq x, y \leq k\}$ を取得します。

例えば、Aidos が数列 $[1, 5, 6, 3]$ を選んだと仮定します。このとき、質問 ask(2) に対しては数値 $5$ が返され、質問 get_pairwise_xor({3, 4}) に対しては、以下のように計算されるため、数列 $[0, 0, 5, 5]$ が返されます。

  • $a_3 \oplus a_4 = 6 \oplus 3 = 5$
  • $a_4 \oplus a_3 = 3 \oplus 6 = 5$
  • $a_3 \oplus a_3 = 6 \oplus 6 = 0$
  • $a_4 \oplus a_4 = 3 \oplus 3 = 0$

Temirulan はこのパズルを解くことができませんでした。あなたの課題は、上記の質問を使用して隠された数列を見つけ出し、彼を助けることです。

入力

提出プログラムは、標準入力から読み込んだり、標準出力へ書き出したり、他のファイルとやり取りしたりしてはいけません。

あなたの課題は、以下の関数を実装することです: int[] guess(int n)

  • $n$: 隠された数列の長さ。
  • この関数は、各テストケースに対してちょうど1回呼び出されます。
  • この関数は、隠された数列を元の順序で返さなければなりません。

あなたの関数は、以下の関数を呼び出すことができます:

  1. int ask(int i)

    • $i$: 数列のインデックス、$1 \leq i \leq n$。
    • この関数は、隠された数列の $i$ 番目の数値を返します。
  2. int[] get_pairwise_xor(int[] pos)

    • $pos$: 数列のインデックスの空でないリスト。
    • $pos$ のすべての要素は相異なる整数でなければなりません。
    • $k$ を $pos$ の要素数とすると、$1 \leq pos_i \leq n$ ($1 \leq i \leq k$) です。
    • この関数は、$k^2$ 個の要素からなるソートされたリスト、すなわち XOR 値のペアの集合 $\{a_{pos_x} \oplus a_{pos_y} \mid 1 \leq x, y \leq k\}$ を返します。

各テストケースにおいて、両方の関数を合計で $200$ 回を超えて呼び出すことはできません。上記の条件のいずれかに違反した場合、プログラムは Wrong Answer と判定されます。それ以外の場合、プログラムは Accepted と判定され、スコアは ask 関数と get_pairwise_xor 関数の合計呼び出し回数に基づいて計算されます(「小課題」のセクションを参照してください)。

小課題

  • $2 \leq n \leq 100$
  • 各 $1 \leq i \leq n$ に対して $0 \leq a_i \leq 10^9$

この課題において、グレーダーは適応型ではありません。つまり、数列 $a$ はグレーダーの実行開始時に固定されており、あなたのプログラムからの呼び出しには依存しません。

  1. (6 点) $n \leq 4$
  2. (94 点) 追加の制約はありません。この小課題では、スコアは以下の方法で計算されます。$q$ を ask 関数と get_pairwise_xor 関数の合計呼び出し回数とします。
    • $q \leq 15$ の場合、スコアは $94$ です。
    • $15 < q \leq 40$ の場合、スコアは $84 - 2(q - 16)$ です。
    • $40 < q \leq 50$ の場合、スコアは $35$ です。
    • それ以外の場合、スコアは $0$ です。

各小課題のスコアは、その小課題のすべてのテストケースにおける結果のうち、最小のスコアとなります。

注記

XOR 演算はビット単位の排他的論理和です。

隠された数列 $a$ が $[1, 5, 6, 3]$ であるとします。グレーダーが関数を呼び出す際のインタラクションの例を以下に示します。

呼び出し 結果
ask(2) $5$
get_pairwise_xor({1, 2, 3}) $\{0, 0, 0, 3, 3, 4, 4, 7, 7\}$
ask(3) $6$
get_pairwise_xor({4, 2}) $\{0, 0, 6, 6\}$
get_pairwise_xor({2}) $\{0\}$

サンプルグレーダーは以下の形式で入力を読み取ります: 1行目: $n$ 2行目: $a_1, a_2, \dots, a_n$

システムから xoractive.zip をダウンロードできます。これには Java、C++11、FPC、Python 2 用の例が含まれています。

関数呼び出しのすべての例は上記に記載されています。Python 2 の場合、def guess(n, interactor) 関数を実装する必要があります。ここで interactor はテスト対象のクラスのインスタンスであり、ask および get_pairwise_xor はこのクラスのメソッドです。

xoractive.zip には各言語の解答例が含まれています。 Java 言語での解答の場合、ファイル名とクラス名はそれぞれ Xoractive.java および Xoractive とする必要があります。 Pascal 言語での解答の場合、ファイル名は xoractive.pas とする必要があります。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.