#CF2001C. 猜测树

    ID: 6372 交互题 1000ms 256MiB 尝试: 2 已通过: 0 难度: 6.5 上传者: 标签>二分查找暴力枚举深度优先搜索及类似方法分治并查集贪心交互题*1500

猜测树

C. 猜测树

  • 每个测试的时间限制:2 秒
  • 内存限制:256 MB

题目类型

这是一个 交互式问题


题目描述

Misuki 选定了一棵有 nn 个节点的秘密树,节点编号为 11nn
你要通过以下类型的查询来猜测这棵树:

查询格式? a b
Misuki 会告诉你一个节点 xx,使得 d(a,x)d(b,x)|d(a, x) - d(b, x)| 最小,其中 d(x,y)d(x, y) 表示节点 xxyy 之间的距离。
如果存在多个这样的节点 xx,Misuki 会告诉你其中 d(a,x)d(a, x) 最小的那个。

你的任务是在最多 15n15n 次查询内找出 Misuki 的秘密树的结构。


输入

每个测试包含多个测试用例。
第一行输入一个整数 tt1t2001 \le t \le 200)——测试用例数。

每个测试用例的第一行是一个整数 nn2n10002 \le n \le 1000),表示树的节点数。

保证所有测试用例的 nn 之和不超过 10001000


交互过程

  1. 首先读入 nn
  2. 你可以进行最多 15n15n 次查询。
  3. 每次查询输出一行 ? a b1a,bn1 \le a, b \le n),然后读入一个整数,即查询的答案。
  4. 当你要输出答案时,输出一行 !,然后按顺序输出 n1n-1 条边,每条边由两个整数 aia_ibib_i 表示。
    格式:! a1 b1 a2 b2 ... a_{n-1} b_{n-1}
    你可以以任意顺序输出这些边。

注意

  • 如果查询次数超过 15n15n,之后任何查询都会返回 1-1。一旦收到 1-1,应立即终止程序(否则会得到 Wrong Answer)。
  • 每输出一行后,要刷新输出缓冲区(例如 cout.flush()fflush(stdout))。

输出示例

输入:

1
4
1
1
3

输出:

? 1 2

? 1 3

? 1 4

! 1 2 1 3 3 4

说明

  • 树是无向无环连通图,nn 个节点的树恰好有 n1n-1 条边。
  • 在示例中:
    • ? 1 2 回答 11,说明节点 1122 之间有一条边。
    • ? 1 3 回答 11,说明节点 1133 之间有一条边。
    • ? 1 4 回答 33,可以推出节点 33 同时连接节点 1144
    • 因此树的边为 (1,2)(1,2)(1,3)(1,3)(3,4)(3,4)

黑客(Hack)格式

对于 hacks,输入格式如下:

  • 第一行:tt1t2001 \le t \le 200
  • 每个测试用例:
    • 第一行:nn
    • 接下来 n1n-1 行,每行两个整数 aia_ibib_i,表示秘密树的一条边。

所有测试用例的 nn 之和不超过 10001000