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

    ID: 10712 远端评测题 2000ms 512MiB 尝试: 0 已通过: 0 显示难度提高 上传者: 标签>交互题Special JudgeO2优化梦熊比赛

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

背景

原题链接:https://oier.team/problems/S3C。


题目描述

这是一道交互题。

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

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

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

现在支持一种操作:你可以给出 i,ji, j(1≤i,j≤2n1 \le i, j \le 2n),然后 jt 会交换 i,ji, j 在 SS 中的位置(如 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} 次时,保证交互库占用时间不超过 1s⁡1\operatorname s,空间不超过 128MB⁡128\operatorname{MB},也就是你至少能使用 1s⁡1 \operatorname{s} 的时间以及 384MB⁡384\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, 2,SS 变为 {(2,5),(1,3),(4,6)}\{(2, 5), (1, 3), (4, 6)\},jt 告诉你 res=3res = 3。

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

接下来你交换 6,26, 2,SS 变为 {(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\% 的数据,1≤T≤1051 \le T \le 10^5,1≤n≤5×104 1 \le n \le 5 \times 10^4,∑n≤105 \sum n \le 10^5。

子任务编号 TT nn limlim 分数
11 =1=1 =0=0 11
ii(2≤i≤62 \le i \le 6) =(2i−1)!!=(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,2n−3)=\max(0, 2n - 3) 3030

!!!! 代表双阶乘。