CF2129F2 Top-K Tracker (Hard Version)
题目描述
这是一个交互题。
这是该问题的困难版本。唯一的区别在于本版本中 $ n \leq 890 $。只有在所有版本的问题都被解决后,你才能进行 Hack。
有一个隐藏的排列 $ p $,它是 $ \{1,2,\ldots,n\} $ 的一个排列。令 $ pos_i $ 表示值 $ i $ 在 $ p $ 中的位置,即 $ pos_{p_i} = i $。
为了找出这个排列,你可以进行以下四种类型的询问:
- “$ 1\ m\ i_1\ i_2\ \ldots\ i_m $”($ 1 \leq m \leq n $,$ i_1,\ i_2,\ \ldots,\ i_m $ 必须互不相同)。令 $ k = \min(60, m) $。裁判会返回 $ [p_{i_1}, p_{i_2}, \ldots, p_{i_m}] $ 中最大的 $ k $ 个数,按升序排列。
- “$ 2\ m\ i_1\ i_2\ \ldots\ i_m $”($ 1 \leq m \leq n $,$ i_1,\ i_2,\ \ldots,\ i_m $ 必须互不相同)。令 $ k = \min(60, m) $。裁判会返回 $ [pos_{i_1}, pos_{i_2}, \ldots, pos_{i_m}] $ 中最大的 $ k $ 个数,按升序排列。
- “$ 3\ m\ i_1\ i_2\ ...\ i_m $”($ 1 \leq m \leq n $,$ i_1,\ i_2,\ ...,\ i_m $ 必须互不相同)。令 $ k = \min(300, m) $。裁判会返回 $ [p_{i_1}, p_{i_2}, ..., p_{i_m}] $ 中最大的 $ k $ 个数,按升序排列。
- “$ 4\ m\ i_1\ i_2\ \ldots\ i_m $”($ 1 \leq m \leq n $,$ i_1,\ i_2,\ \ldots,\ i_m $ 必须互不相同)。令 $ k = \min(300, m) $。裁判会返回 $ [pos_{i_1}, pos_{i_2}, \ldots, pos_{i_m}] $ 中最大的 $ k $ 个数,按升序排列。
令 $ c_i $ 表示第 $ i $ 类询问的使用次数($ 1 \leq i \leq 4 $)。你的询问次数必须满足以下约束:
- $ c_1+c_2+c_3+c_4 \leq 30 $。
- $ c_3+c_4 \leq 1 $。
输入格式
每组测试包含多组测试用例。第一行包含测试用例数 $ t $($ 1 \leq t \leq 40 $)。接下来是每组测试用例的描述。
输出格式
每组测试用例的第一行包含一个整数 $ n $($ 2 \leq n \leq 890 $)。此时,排列 $ p $ 已经被选定。本题的交互器是非自适应的。换句话说,每组测试用例中的排列 $ p $ 是固定的,在交互过程中不会改变。
要发起第 1 类询问,你需要输出如下格式的一行(不含引号):
- “$ 1\ m\ i_1\ i_2\ \ldots\ i_m $”($ 1 \leq m \leq n $,$ i_1, i_2, \ldots, i_m $ 必须互不相同)
之后,你会收到 $ k=\min(60,m) $ 个整数——即 $ [p_{i_1}, p_{i_2}, \ldots, p_{i_m}] $ 中最大的 $ k $ 个数,按升序排列。
要发起第 2 类询问,你需要输出如下格式的一行(不含引号):
- “$ 2\ m\ i_1\ i_2\ \ldots\ i_m $”($ 1 \leq m \leq n $,$ i_1, i_2, \ldots, i_m $ 必须互不相同)
之后,你会收到 $ k=\min(60,m) $ 个整数——即 $ [pos_{i_1}, pos_{i_2}, \ldots, pos_{i_m}] $ 中最大的 $ k $ 个数,按升序排列。
要发起第 3 类询问,你需要输出如下格式的一行(不含引号):
- “$ 3\ m\ i_1\ i_2\ \ldots\ i_m $”($ 1 \leq m \leq n $,$ i_1, i_2, \ldots, i_m $ 必须互不相同)
之后,你会收到 $ k=\min(300,m) $ 个整数——即 $ [p_{i_1}, p_{i_2}, \ldots, p_{i_m}] $ 中最大的 $ k $ 个数,按升序排列。
要发起第 4 类询问,你需要输出如下格式的一行(不含引号):
- “$ 4\ m\ i_1\ i_2\ \ldots\ i_m $”($ 1 \leq m \leq n $,$ i_1, i_2, \ldots, i_m $ 必须互不相同)
之后,你会收到 $ k=\min(300,m) $ 个整数——即 $ [pos_{i_1}, pos_{i_2}, \ldots, pos_{i_m}] $ 中最大的 $ k $ 个数,按升序排列。
接下来,如果你的程序已经找到了排列 $ p $,请输出如下格式的一行(不含引号):
- “$ !\ p_1\ p_2\ \ldots\ p_n $”
注意,这一行不计入询问次数。
输出每次询问或每组测试用例的答案后,别忘了输出换行并刷新输出缓冲区,否则你会收到 Idleness Limit Exceeded 的判定。为此,你可以使用:
- C++:fflush(stdout) 或 cout.flush()
- Java:System.out.flush()
- Pascal:flush(output)
- Python:stdout.flush()
- 其它语言请参考相关文档。
Hack 格式
Hack 时请按照如下测试格式:
第一行包含测试用例数 $ t $($ 1 \leq t \leq 40 $)。接下来是每组测试用例的描述。
每组测试用例的第一行包含一个整数 $ n $($ 2 \leq n \leq 890 $)。
每组测试用例的第二行包含 $ n $ 个整数 $ p_1, p_2, \ldots, p_n $,它是 $ \{1,2,\ldots,n\} $ 的一个排列。
说明/提示
在第一个测试用例中,隐藏的排列为 $ p = [3, 1, 2] $。因此,$ pos = [2, 3, 1] $。
对于询问 “3 2 3 1”,裁判返回 $ 2 $ 和 $ 3 $,因为 $ 2 $ 和 $ 3 $ 是 $ [p_3, p_1] $ 中最大的 $ k $ 个数,其中 $ k = \min(300, m) = \min(300, 2) = 2 $。
对于询问 “2 1 2”,裁判返回 $ 3 $,因为 $ 3 $ 是 $ [pos_2] $ 中最大的 $ k $ 个数,其中 $ k = \min(60, m) = \min(60, 1) = 1 $。
注意,样例仅用于帮助理解题意,并不保证能唯一确定排列 $ p $。
由 ChatGPT 4.1 翻译