注意:本题仅支持使用 C++ 和 Java 语言。
Lim Li 热爱动漫,最近从亚马逊购买了一整季的《干物妹!小埋》。这 $N$ 集动画存放在 $N$ 张 CD 中,每张 CD 包含一集。CD 的标签编号为 $1, \dots, N$,而动画剧集的编号也为 $1, \dots, N$。她准备开始观看时,却发现由于制造故障,剧集编号与 CD 上的标签并不匹配!
她立即联系了亚马逊,对方告知虽然 CD 标签与剧集编号不匹配,但这些剧集只是被打乱了顺序,集合中没有任何一集缺失。为了避免剧透,Lim Li 不愿亲自播放 CD 来确定每张 CD 中存放的是哪一集。
因此,Lim Li 决定寻求她的朋友——猫咪 Rar 的帮助。她将遵循以下流程:
- Lim Li 将她的 CD 分成 $B$ 个盒子,每个盒子装有 $K$ 张 CD。($N = B \times K$)
- 这些盒子会被运送给 Rar。在运输过程中,每个盒子内的 CD 可能会发生位移,盒子本身的顺序也可能发生改变。因此,每个盒子内 CD 的顺序以及盒子本身的顺序在运输过程中都可能被打乱。
- Rar 收到盒子后,会在他自己的 CD 播放器上播放这些 CD。
- Rar 会记录下他在每个盒子中发现的剧集集合,并将这些信息写在 $B$ 张独立的纸条上发送回给 Lim Li。每张纸条上写有 $K$ 个整数,即该盒子内 CD 所对应的剧集编号。
- 整套 $N$ 张 CD 会被退还给 Lim Li。
此过程最多可执行 $Q$ 次,超过次数后 Rar 会感到厌烦并停止帮助她。请帮助 Lim Li 在 Rar 的最少帮助下确定每张 CD 中的剧集编号。
实现细节
这是一道交互题。请勿从标准输入读取数据或向标准输出写入数据。
你需要实现以下函数:
- C++:
vector<int> solve(int N, int B, int K, int Q, int ST) - Java:
public int[] solve(int N, int B, int K, int Q, int ST)
solve 函数将被调用且仅被调用一次。
你可以调用以下评测库函数来完成任务:
- C++:
vector<vector<int>> shuffle(vector<vector<int>> boxes) - Java:
public static int[][] shuffle(int[][] boxes)
调用 shuffle 函数时需传入一个二维数组 boxes,描述 Lim Li 将 $N$ 张 CD 分组为 $B$ 个盒子的方案。boxes 的格式应为包含 $B$ 个一维数组,每个一维数组包含 $K$ 个整数,代表盒子内 CD 的标签。如果你的程序调用此函数的次数超过 $Q$ 次,或传入了无效参数,程序将立即终止并获得 Wrong Answer 判决。
传递给 shuffle 函数的数组不会被修改。换句话说,在调用 shuffle 函数后,你可以预期二维数组 boxes 保持不变。
shuffle 函数将返回一个二维数组,描述 Rar 提供的信息。该二维数组由 $B$ 个一维数组组成,每个数组包含 $K$ 个整数,描述了盒子内 CD 对应的剧集编号。
样例
假设 $N = 6, B = 3, K = 2, Q = 100$,且测试用例属于子任务 2。剧集顺序为 $[3, 1, 4, 5, 2, 6]$。你的函数将被调用,参数如下:
solve(6, 3, 2, 100, 2)
一种可能的交互过程如下:
shuffle([[1, 2], [3, 4], [5, 6]]) = [[6, 2], [5, 4], [3, 1]]二维数组[[1, 2], [3, 4], [5, 6]]代表 Lim Li 发送的三个盒子中的 CD 标签。由于盒子顺序被打乱且每个盒子内的 CD 也被打乱,Rar 收到的盒子可能对应二维数组[[6, 5], [4, 3], [1, 2]]。Rar 找到这些 CD 标签对应的剧集并报告[[6, 2], [5, 4], [3, 1]]。shuffle([[2, 6], [3, 1], [5, 4]]) = [[6, 1], [2, 5], [4, 3]]由于盒子被打乱,Rar 收到的盒子可能对应二维数组[[6, 2], [5, 4], [3, 1]]。Rar 找到这些 CD 标签对应的剧集并报告[[6, 1], [2, 5], [4, 3]]。shuffle([[6, 5], [4, 2], [3, 1]]) = [[5, 1], [3, 4], [2, 6]]由于盒子被打乱,Rar 收到的盒子可能对应二维数组[[4, 2], [1, 3], [5, 6]]。Rar 找到这些 CD 标签对应的剧集并报告[[5, 1], [3, 4], [2, 6]]。
此时,你的程序认为已获得足够信息,并推断出剧集顺序为 $[3, 4, 1, 5, 2, 6]$。因此,你的程序将返回 $[3, 4, 1, 5, 2, 6]$。由于剧集顺序正确,且程序使用的查询次数少于 100 次,该测试用例将被判定为正确。
子任务
每个实例的最大执行时间为 1.0 秒。对于所有测试用例,输入满足以下界限:
- $B, K \ge 2$
- $N \ge 6$
- $N = B \times K$
你的程序将在满足以下限制的输入实例上进行测试:
| 子任务 | 分数 | 附加限制 |
|---|---|---|
| 1 | 2 | $N = 6, B = 2, K = 3, Q = 100$ |
| 2 | 3 | $N = 6, B = 3, K = 2, Q = 100$ |
| 3 | 12 | $N \le 1000, Q = 12$。$B$ 个盒子的顺序保持不变。 |
| 4 | 16 | $N \le 1000, K = 2, Q = 4$ |
| 5 | 15 | $N \le 1000, B = 2, Q = 12$ |
| 6 | 52 | $N \le 1000, Q = 2000, B, K > 2$。请阅读“评分”部分了解详情。 |
评分
子任务 6 是一个特殊的评分子任务。你的得分取决于你在任何测试用例中进行的最大查询次数 $q$。
- 如果 $q > 2000$,你将获得 0 分。
- 如果 $500 < q \le 2000$,你将获得 8 分。
- 如果 $50 < q \le 500$,你将获得 17 分。
- 如果 $9 < q \le 50$,你将获得 $22 + 30 \times (\frac{50-q}{41})^2$ 分。
- 如果 $q \le 9$,你将获得 52 分。
测试
你可以从附件中下载评测库文件、头文件(针对 C++)和解决方案模板。样例测试用例也一并提供以供参考。请使用提供的编译和运行脚本(.sh 文件)进行测试。
评测输入格式
- 第一行包含五个整数 $N, B, K, Q$ 和 $ST$,其中 $ST$ 是子任务编号。
- 第二行包含 $N$ 个整数,即剧集 $E_1, E_2, \dots, E_N$。