QOJ.ac

QOJ

시간 제한: 1.0 s 메모리 제한: 1024 MB 총점: 100 인터랙티브 해킹 가능 ✓

#15314. Menji、会いたいよ!

통계

これはインタラクティブ問題です。

Menji が迷子になってしまい、みんな彼を恋しがっています。あなたの仕事は彼を見つけ出すことです!

$n$ 個の頂点からなる二分木 $T$ があり、木 $T$ の各辺の長さは $1$ です。Menji は頂点 $X$ に隠れています。あなたは木の構造を知っていますが、$X$ は知りません。

$X$ を見つけるために、信号を送ることができます。頂点 $u$ と信号強度 $k$ を選び、頂点 $u$ から強度 $k$ の信号を送ることができます。$u$ と $X$ の間の距離が $k$ 以下であれば、Menji は信号を受け取って信号を返し、あなたはその信号を受け取ります。そうでなければ、何も受け取りません。

信号の送信には時間がかかり、あなたは急いでいるため、$40$ 回以内の信号送信で Menji の位置を特定してください。

インタラクションプロトコル

入力は複数のテストケースを含みます。入力の最初の行には、テストケースの個数を表す整数 $T$($1 \le T \le 100$)が含まれます。

各テストケースについて、最初の行には木の頂点数を表す整数 $n$($2 \le n \le 3 \times 10^4$)が含まれます。

2行目には $n - 1$ 個の整数 $fa_2, fa_3, \dots, fa_n$($1 \le fa_i < i$)が含まれます。ここで $fa_i$ は木における頂点 $i$ の親です。木は頂点 $1$ を根としています。

この木は二分木であること、すなわち $fa_i = fa_j = fa_k$ となるような $1 < i < j < k \le n$ は存在しないことが保証されています。

信号を送るには、以下の形式で1行出力してください:

  • ? u k:頂点 $u$ で強度 $k$ の信号を発することを表す。$1 \le u \le n, 0 \le k \le n$ を満たす必要がある。その後、整数 $o$($o \in \{0, 1\}$)を読み込む。信号を受け取った場合、すなわち $dis(u, X) \le k$ の場合は $o = 1$ であり、そうでない場合は $o = 0$ である。

答えを報告するには、以下の形式で1行出力してください:

  • ! u:$X = u$ を見つけたことを表す。これを出力した後は次のテストケースに進み、これ以上テストケースがない場合はプログラムを終了する必要がある。

各テストケースについて、信号は最大で $40$ 回まで送ることができます。答えの報告は信号の送信回数には含まれません。

$40$ 回を超えて信号を送った場合、送った信号の形式が不正な場合、あるいは報告した答えが誤っている場合、インタラクションは終了し、Wrong answer の判定を受け取ります。

インタラクタは適応的(adaptive)であることに注意してください。つまり、制約および過去の質問への回答と矛盾しない限り、あなたの質問に応じて答えが変化する可能性があります。

すべてのテストケースにおける $n$ の総和が $3 \times 10^4$ を超えないことが保証されています。

各行を出力した後は、改行を出力し、出力ストリームをフラッシュ(flush)することを忘れないでください。ストリームをフラッシュするには、C++ では fflush(stdout) または cout.flush()、Java では System.out.flush()、Python では stdout.flush() を使用できます。

入出力例

入力例 1

2
7
1 1 2 2 3 3

1

0

0

7
1 1 2 2 3 3

0

1

出力例 1

? 2 1

? 3 2

? 4 0

! 5

? 2 1

? 3 0

! 3

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.