这是一道交互题。
提交注意事项:
- 不要引入头文件
perm.h。
- 在文件头粘贴如下的内容:
#include <vector>
void init(int, int);
std::vector<int> perm(int);
int query(int, int);
- 使用 C++ 17 / 20 提交。
小 H 和小 L 正在玩一个猜排列的游戏。
小 H 有一个 的排列 。现在小 L 知道了排列的长度 ,他希望通过特定的询问方式猜出这个排列 。具体地,小 L 可以向小 H 提出如下形式的询问:
- 给定非负整数 满足 ,求 中未出现过的最小非负整数。
不过小 H 和小 L 发现,即便可以进行任意多次询问,有时也不足以唯一确定这个排列 。于是两人约定:假设小 H 的答案是 ,而小 L 猜测的排列是 ,如果在 和 这两个排列中,对于任意 ,区间 中未出现过的最小非负整数,始终等于区间 中未出现过的最小非负整数,那么就认为小 L 的猜测是正确的。
为了增加游戏的难度,小 H 限制了小 L 的询问次数。你需要帮助小 L 猜出小 H 的排列。
【实现细节】
选手不需要,也不应该实现 main 函数。
选手需要确保提交的程序包含头文件 perm.h,即在程序开头加入以下代码:
选手需要在提交的程序源文件 perm.cpp 中实现以下两个函数:
- 分别表示测试点编号与测试数据组数。 表示该测试点为样例。
- 对于每个测试点,该函数会在程序开始运行时被交互库调用恰好一次。
std::vector<int> perm(int n);
- 表示排列的长度。
- 该函数需要返回一个 的排列,表示小 L 的猜测。
- 对于每个测试点,该函数会被交互库调用恰好 次。
选手可以通过调用以下函数进行一次询问:
- 表示询问的区间。选手需要保证 。
- 该函数会返回 中未出现过的最小非负整数。
- 选手需要保证交互库每次调用
perm 时,调用该函数的次数不超过 。
注意:在任何情况下,最终测试时所用的交互库运行所需时间均不会超过 秒,所用内存为固定大小,且均不超过 MiB。
【测试程序方式】
试题目录下的 grader.cpp 是交互库参考实现,最终测试时所用的交互库实现与该参考实现有所不同,因此选手的解法不应该依赖交互库实现。
选手可以在本题目录下使用如下命令编译得到可执行程序:
g++ grader.cpp perm.cpp -o perm -std=gnu++14 -O2 -static