C - Tree Queries Editorial /

Time Limit: 2 sec / Memory Limit: 1024 MB

配点 : 500

問題文

N 頂点の木があり、各頂点には 1,\ldots,N と番号が付けられています。
また、各整数 u,v\, (1 \leq u,v \leq N) に対し、頂点 u,v の距離 d_{u,v} を次のように定めます。

  • 頂点 u と頂点 v を結ぶ最短パスに含まれる辺の本数

あなたは次のような質問を 0 回以上 2N 回以下行うことが出来ます。

  • 1\leq u,v \leq N かつ u+v>3 を満たす整数 u,v を指定し、頂点 u,v の距離 d_{u,v} を聞く。

頂点 1,2 の距離 d_{1,2} を求めてください。

制約

  • 3 \leq N \leq 100
  • N は整数
  • 木はプログラムとジャッジの対話の開始前に決定される

入出力

この問題はインタラクティブな問題(あなたの作成したプログラムとジャッジプログラムが入出力を介して対話を行う形式の問題)である。

まず、あなたのプログラムに標準入力から正の整数 N が与えられる。

N

その後、あなたは質問を行うことが出来る。
質問は標準出力に以下の形式で出力せよ(末尾に改行を入れること)。

? u v

質問が正当な場合、その質問への答え d_{u,v} が標準入力から与えられる。

d_{u,v}

質問の形式が間違っている・質問を規定の回数より多く行った等の理由から質問が不正と判定された場合、質問への答えの代わりに -1 が与えられる。

-1

この時、提出はすでに不正解と判定されている。ジャッジプログラムはこの時点で終了するため、あなたのプログラムも終了するのが望ましい。

答え d_{1,2} が分かったら、標準出力に以下の形式で出力せよ(末尾に改行を入れること)。

! d_{1,2}

注意点

  • 出力を行うたびに標準出力をflushせよ。そうしなかった場合、ジャッジ結果が TLE となる可能性がある。
  • 答えを出力したら(または -1 を受け取ったら)直ちにプログラムを正常終了せよ。そうしなかった場合、ジャッジ結果は不定である。
  • 不正なフォーマットの出力を行った場合のジャッジ結果は不定である。
  • 特に、余計な改行も不正なフォーマットの出力とみなされるので注意せよ。

入出力例

木がこの画像のような時の対話の一例を示します。

入力 出力 説明
3 まず整数 N が与えられます。
? 1 3 1 回目の質問として頂点 1,3 の距離を聞きます。
1 頂点 1,3 の距離が与えられます。
? 2 2 2 回目の質問として頂点 2,2 の距離を聞きます。
0 頂点 2,2 の距離が与えられます。
? 2 3 3 回目の質問として頂点 2,3 の距離を聞きます。
1 頂点 2,3 の距離が与えられます。
? 3 1 4 回目の質問として頂点 3,1 の距離を聞きます。
1 頂点 3,1 の距離が与えられます。
? 3 2 5 回目の質問として頂点 3,2 の距離を聞きます。
1 頂点 3,2 の距離が与えられます。
? 2 2 6 回目の質問として頂点 2,2 の距離を聞きます。
0 頂点 2,2 の距離が与えられます。
! 2 頂点 1,2 の距離を回答し、終了します。実際に木の頂点 1,2 の距離は 2 であるため AC が得られます。

Score : 500 points

Problem Statement

There is a tree with N vertices, numbered 1, \ldots, N.
For each pair of integers u,v\, (1 \leq u,v \leq N), the distance d_{u,v} between Vertices u, v is defined as the following.

  • The number of edges contained in the shortest path connecting Vertices u and v.

You are allowed to ask between 0 and 2N questions (inclusive) in the following form.

  • Ask the distance d_{u,v} between Vertices u,v for integers u,v of your choice such that 1\leq u,v \leq N and u+v>3.

Find the distance d_{1,2} between Vertices 1,2.

Constraints

  • 3 \leq N \leq 100
  • N is an integer.
  • The tree is determined before the start of the interaction between your program and the judge.

Input and Output

This is an interactive task, in which your program and the judge interact via input and output.

First, your program is given a positive integer N from Standard Input:

N

Then, you get to ask questions.
A question should be printed in the following format (with a newline at the end):

? u v

If the question is valid, the response d_{u,v} is given from Standard Input:

d_{u,v}

If the question is judged invalid because, for example, it is malformed or you have asked too many questions, you get -1 instead of the response:

-1

At this point, your submission is already judged incorrect. The judge's program then terminates; yours should too, desirably.

When you find the answer d_{1,2}, print it to Standard Output in the following format (with a newline at the end):

! d_{1,2}

Notices

  • Flush Standard Output after each output. Otherwise, you might get the TLE verdict.
  • After printing the answer (or receiving -1), immediately terminate the program normally. Otherwise, the verdict would be indeterminate.
  • The verdict for the case of a malformed output would be indeterminate.
  • Specifically, note that too many newlines would also be seen as a malformed output.

Sample Input and Output

The following is a sample interaction for the tree shown in this image.

Input Output Description
3 Interaction starts with the integer N.
? 1 3 As the 1-st question, you ask the distance between Vertices 1 and 3.
1 The distance between Vertices 1,3 is returned.
? 2 2 As the 2-nd question, you ask the distance between Vertices 2 and 2.
0 The distance between Vertices 2,2 is returned.
? 2 3 As the 3-rd question, you ask the distance between Vertices 2 and 3.
1 The distance between Vertices 2,3 is returned.
? 3 1 As the 4-th question, you ask the distance between Vertices 3 and 1.
1 The distance between Vertices 3,1 is returned.
? 3 2 As the 5-th question, you ask the distance between Vertices 3 and 2.
1 The distance between Vertices 3,2 is returned.
? 2 2 As the 6-th question, you ask the distance between Vertices 2 and 2.
0 The distance between Vertices 2,2 is returned.
! 2 You guess the distance between Vertices 1,2 and terminate. The actual distance between them is 2, so you would get the AC verdict.