CF2129F2.Top-K Tracker (Hard Version)

NOI/NOI+/CTSC

通过率:0%

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

这是一个交互题。

这是该问题的困难版本。唯一的区别在于本版本中 $ 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} $ 的一个排列。

输入输出样例

  • 输入#1

    2
    3
    
    2 3
    
    3
    
    2
    
    2

    输出#1

    3 2 3 1
    
    2 1 2
    
    ! 3 1 2
    
    4 1 1
    
    ! 2 1

说明/提示

在第一个测试用例中,隐藏的排列为 $ 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 翻译

输入解题思路,AI测评打分。不知道怎么写?

首页