#P10887. 【MX-S3-T3】「FeOI Round 1」再演

【MX-S3-T3】「FeOI Round 1」再演

题目背景

题目描述

这是一道交互题。

jt 有一个大小为 nn 的集合 SS,集合中每个元素都是一个无序二元整数对 (x,y)(x, y),保证集合中 12n1 \sim 2n2n2n 个整数每个恰好出现一次。

比如当 n=3n = 3 时,合法的集合 SS 可能是 {(1,5),(2,3),(4,6)}\{(1, 5), (2, 3), (4, 6)\}

开始时你只知道 nn 而不知道 SS 具体是什么。

现在支持一种操作:你可以给出 i,ji, j1i,j2n1 \le i, j \le 2n),然后 jt 会交换 i,ji, jSS 中的位置(如 i,ji, j 在同一个二元组内,或 i=ji = j,则什么也不会发生)。

比如,当 S={(1,5),(2,3),(4,6)}S = \{(1, 5), (2, 3), (4, 6)\} 时,执行 i=2,j=6i = 2, j = 6 后 $S = \{(1, 5), (6, 3), (4, 2)\} = \{(1, 5), (2, 4), (3, 6)\}$。

在最开始时以及每次操作过后,对于当前的集合 SS,jt 会告诉你 res=min(x,y)Smax(x,y)res = \min\limits_{(x, y) \in S} \max(x, y)

比如,当 S={(1,5),(2,3),(4,6)}S = \{(1, 5), (2, 3), (4, 6)\} 时,resres 为 $\min(\max(1, 5), \max(2, 3), \max(4, 6)) = \min(5, 3, 6) = 3$。

注意,每次 jt 告诉你 resres 之后不会撤销你做的操作,即你的操作是持续有效的。

你需要在 limlim 次操作内猜出初始的集合 SS,即进行所有交换操作之前的版本。

保证初始的 SS 是提前确定的,即交互库不自适应

交互方式

本题单个测试点内包含多组数据。

首先读入数据组数 TT

接下来有 TT 组数据,对于每组数据进行以下过程:

输入 SS 的大小 nn 以及 limlim 以开始交互。

每次操作,首先读入 resres,接下来输出一行 ^ i j 表示你要执行操作 i,ji, j

在你确定答案后,请先输出一行一个 !,然后接下来 nn 行每行输出两个整数 x y 代表 SS 中的一个二元组,然后准备读入下一组数据。你可以以任意顺序输出这些二元组,且二元组内元素顺序可以任意。

每次在你输出一行后,请清空缓冲区:

  • 在 C++ 中,使用 fflush(stdout)cout.flush()
  • 在 Pascal 中,使用 flush(output)
  • 在 Python 中,使用 stdout.flush()
  • 其它语言请自行查阅文档。

当你在单个测试点所有测试数据的总操作次数不超过 2.5×105\boldsymbol{2.5 \times 10^5} 次时,保证交互库占用时间不超过 1s1\operatorname s,空间不超过 128MB128\operatorname{MB},也就是你至少能使用 1s1 \operatorname{s} 的时间以及 384MB384\operatorname{MB} 的空间。

输入格式

见「交互方式」。

输出格式

见「交互方式」。

2
3 100
3

3

4

2




1 0
2



^ 1 2

^ 3 6

^ 6 2

!
5 1
6 4
2 3


!
1 2

提示

【样例解释】

注意,样例只是描述了一个可能发生的交互过程,并不一定存在逻辑(就是说答案可能是乱猜猜对的)。

对于第一组测试数据,SS 最开始为 {(1,5),(2,3),(4,6)}\{(1, 5), (2, 3), (4, 6)\},jt 告诉你 res=3res = 3

接下来你交换 1,21, 2SS 变为 {(2,5),(1,3),(4,6)}\{(2, 5), (1, 3), (4, 6)\},jt 告诉你 res=3res = 3

接下来你交换 3,63, 6SS 变为 {(2,5),(1,6),(3,4)}\{(2, 5), (1, 6), (3, 4)\},jt 告诉你 res=4res = 4

接下来你交换 6,26, 2SS 变为 {(5,6),(1,2),(3,4)}\{(5, 6), (1, 2), (3, 4)\},jt 告诉你 res=2res = 2

你输出 {(5,1),(6,4),(2,3)}\{(5, 1), (6, 4), (2, 3)\},用了 33 次操作,不超过 lim=100lim = 100 次,回答正确。

对于第二组测试数据,SS 初始为 {(1,2)}\{(1, 2)\},你直接输出 {(1,2)}\{(1, 2)\},用了 00 次操作,不超过 lim=0lim = 0 次,回答正确。

【数据范围】

本题开启捆绑测试。

n\sum n 为单个测试点内所有的 nn 之和。

对于 100%100\% 的数据,1T1051 \le T \le 10^51n5×104 1 \le n \le 5 \times 10^4n105 \sum n \le 10^5

子任务编号 TT nn limlim 分数
11 =1=1 =0=0 11
ii2i62 \le i \le 6 =(2i1)!!=(2i-1)!! =i=i =109=10^9 88
77 5\le 5 100\le 100 =5n2=5n^2 1414
88 25\le 25 103\le 10^3 =10n=10n 1515
99 105\le 10^5 5×104\le 5 \times 10^4 =max(0,2n3)=\max(0, 2n - 3) 3030

!!!! 代表双阶乘