#HK5232. 「UOI 2021 Stage 4 Day2」猜排列

「UOI 2021 Stage 4 Day2」猜排列

题目描述

题目译自 Ukrainian Olympiads in Informatics 2021 Stage 4 Day2 T3. Вгадайте перестановкуД

给定一个由 nn 个数字组成的排列(nn22 的幂次方)。你不知道这个排列的具体顺序。

排列是指长度为 nn 的整数序列,包含从 11nn 的所有数字,并且每个数字恰好出现一次。例如,[1][1][4,3,5,1,2][4, 3, 5, 1, 2][3,2,1][3, 2, 1] 是排列,而 [1,1][1, 1][4,3,1][4, 3, 1][2,3,4][2, 3, 4] 不是。

你可以进行一种查询操作:提交一个长度为 nn 的数组 aa,其中 1ain1 \leq a_i \leq n(注意,aa 不一定是排列)。作为响应,你将收到一个长度为 nn 的数组 cc,其生成规则如下:

c = 长度为 n 的全零数组
for i = 1 to n:
    if p[a[i]] > p[i]:
        c[a[i]] += 1
返回 c

你的目标是找出隐藏的排列 pp。允许的最大查询次数见「数据范围与提示」部分。

输入格式

第一行包含两个整数 ttqq (1t,q256)(1 \leq t, q \leq 256),分别表示输入数据的组数和每组数据中允许的最大查询次数。

交互方式

对于每组输入数据,首先读取一个整数 nn (1n1024)(1 \leq n \leq 1024),表示排列 pp 的元素数量。

保证 nn22 的幂次方(即存在非负整数 kk,使得 2k=n2^k = n)。

要进行一次查询,输出格式为 1 a1 a2an1\ a_1\ a_2 \ldots a_n (1ain)(1 \leq a_i \leq n)

作为响应,评测程序将返回一个数组 cc,格式为 c1 c2  cnc_1\ c_2\ \ldots\ c_n,按照题目描述的规则生成。

在输出查询后,务必输出换行符并清空输出缓冲区,否则可能会导致「超时」判定。清空缓冲区的方法如下:

  • 在 C++ 中使用 fflush(stdout)\texttt{fflush(stdout)}cout.flush()\texttt{cout.flush()}
  • 在 Java 中使用 System.out.flush()\texttt{System.out.flush()}
  • 在 Pascal 中使用 flush(output)\texttt{flush(output)}
  • 在 Python 中使用 stdout.flush()\texttt{stdout.flush()}
  • 其他语言请参考相关文档。

请注意,如果你的查询无效(例如超过查询次数限制或输入数组不符合约束条件),交互器将输出 -1 并终止运行。如果读取到 -1,请立即终止程序,以获得「答案错误」判定,而不是其他未定义的判定结果。

当你找到排列 pp 时,输出 2 p1 p2  pn2\ p_1\ p_2\ \ldots \ p_n

如果这是最后一组输入数据,则应终止程序;否则,继续处理下一组输入数据。

1 256
4

0 1 1 1



1 3 2 4 2

2 1 4 2 3

在第一次查询中,得知 p1<p3<p4<p2p_1 < p_3 < p_4 < p_2

因此,目标排列为 [1,4,2,3][1, 4, 2, 3]

数据范围与提示

qq 表示程序允许的最大查询次数。

详细子任务附加限制及分值如下表所示:

子任务 分值 附加限制
11 33 n16,q=256,t=128n \leq 16, q=256, t=128
22 77 n32,q=256,t=128n \leq 32, q=256, t=128
33 88 n256,q=256,t=128n \leq 256, q=256, t=128
44 1414 n512,q=256,t=128n \leq 512, q=256, t=128
55 2020 n512,q=128,t=256n \leq 512, q=128, t=256
66 4848 n1024,q=127,t=256n \leq 1024, q=127, t=256

对于最后一个子任务,设 kk 为单组数据中使用的最大查询次数,则得分如下:

  • k>127k > 127,得 00 分;
  • 55<k12755 < k \leq 127,得 4824(k55)3748 - \lceil \frac{24(k-55)}{37} \rceil 分;
  • k55k \leq 55,得 4848 分。