#P13777. 【PR #16】CD Shuffle

【PR #16】CD Shuffle

题目描述

请在程序开头添加 shuffle.h 下发文件

这是一道交互题。

你购买了一套包含 NN 集【数据删除】的 CD 套装。每张 CD 都有一个标签编号 11NN,但 CD 内实际存储的剧集编号与标签编号不匹配。已知:

  1. 所有剧集 11NN 都存在且不重复
  2. CD 标签编号 11NN 与剧集编号是一个排列关系

你需要通过若干轮交互,确定每个 CD 标签对应的实际剧集编号,每一轮交互的流程如下:

  1. 分组阶段:将 NN 张 CD 分成 BB 个盒子,每个盒子包含 KK 张 CD(保证 N=B×KN = B \times K

  2. 发送阶段:将分组后的 CD 发送给朋友小 L

    • 盒子之间的顺序会被打乱
    • 每个盒子内的 CD 顺序也会被打乱
  3. 接收阶段:小 L 会:

    • 查看每个盒子中 CD 的实际剧集编号
    • 将结果以任意顺序返回(不保留原始分组信息)

你最多可以进行 QQ 次这样的交互,交互完成后,你需要确定每个 CD 标签对应的剧集编号。

交互方式与实现细节

你需要实现以下函数:

vector<int> solve(int N, int B, int K, int Q, int ST)

其中,STST 表示 subtask 的 ID。

你需要返回一个 vector,其中第 ii 个数表示标签编号为 ii 的 CD 的实际剧集编号。

在交互过程中,你可以调用如下函数:

vector<vector<int>> shuffle(vector<vector<int>> boxes)

参数说明:

  • boxes:一个 B×KB \times K 的二维数组,表示当前分组方案
  • 返回值:一个 B×KB \times K 的二维数组,表示每个盒子中 CD 的实际剧集编号(顺序随机)

注意事项:

  1. 调用 shuffle 次数不能超过 QQ
  2. 每次调用 shuffle 时,必须提供合法的分组方案(BB 个盒子,每个盒子 KK 张 CD,且包含所有 11NN 的 CD 标签)

样例

初始条件:

  • N=6N=6, B=3B=3, K=2K=2, Q=100Q=100
  • 实际剧集编号对应关系:[3,1,4,5,2,6][3,1,4,5,2,6](即标签1→剧集3,标签2→剧集1,...)

交互过程:

  • 调用 shuffle([[1,2],[3,4],[5,6]])- 可能返回 [[6,2],[5,4],[3,1]]

  • 调用 shuffle([[2,6],[3,1],[5,4]])- 可能返回 [[6,1],[2,5],[4,3]]

  • 调用 shuffle([[6,5],[4,2],[3,1]])- 可能返回 [[5,1],[3,4],[2,6]]

正确输出:

  • 返回 [3,1,4,5,2,6]

样例1

6 2 3 100 1
5 4 2 3 1 6

数据范围与约定

对于所有数据,有:

  • B,K2B,K\geq 2
  • N6N\geq 6
  • N=B×KN=B\times K

子任务:

子任务编号特殊性质分值
$1$$N=6$, $B=2$, $K=3$, $Q=100$$2$
$2$$N=6$, $B=3$, $K=2$, $Q=100$$3$
$3$$N \leq 1000$, $Q=12$,保证返回结果时盒子顺序不变$15$
$4$$N \leq 1000$, $K=2$, $Q=4$$20$
$5$$N \leq 1000$, $B=2$, $Q=12$$20$
$6^{*}$$N \leq 1000$, $Q=2000$, $B,K>2$$40$

* :子任务 66 有部分分,令 qq 为你的最大询问次数:

  • q>2000q > 200000
  • 500<q2000500 < q \leq 200066
  • 50<q50050 < q \leq 5001515
  • 9<q509 < q \leq 5015+25×(50q41)215 + 25 \times (\frac{50-q}{41})^2
  • q9q \leq 94040