luogu#P12090. [RMI 2019] 秘密排列 / Secret Permutation
[RMI 2019] 秘密排列 / Secret Permutation
题目背景
不要引入 permutation.h
。
你需要在文件头添加
int query(vector<int>);
void answer(vector<int>);
我们在附件中提供了 Sample Grader。
题目描述
这是一道交互题。本题中,交互库是非自适应的。
有一个隐藏的 的排列 。
你可以进行如下的询问:
询问 给定 的排列 。交互库会返回
$$\sum_{1\le i\le n-1} \left|p_{v_i}-p_{v_{i+1}}\right| $$
目标是,找到与 等价的任意一个排列 。
定义:我们说排列 , 等价,当且仅当它们无法通过询问区分。亦即,无论 取什么,询问的答案都相同。
实现细节
你不需要,也不应该实现 main
函数。
你需要在文件头添加
int query(vector<int>);
void answer(vector<int>);
你应该实现如下的函数:
void solve(int n);
每个测试点中仅调用一次,表示要找出长度为 的排列 。
你可以调用如下的函数:
int query(vector<int> v);
- 发起一次询问。
- ()是一个 的排列。
- 返回 $\displaystyle \sum_{1\le i\le n-1} \left|p_{v_i}-p_{v_{i+1}}\right|$。
void answer(vector<int> p);
- 报告排列 。
- ()表示你找到的排列。
- 调用此函数后,程序将立刻终止。
注意:参数中的数组都是 的。
输入格式
Sample Grader 输入格式如下:
输出格式
Sample Grader 将如下内容输出到标准输出流:
- 对于每次
query
调用,输出参数 和query
的返回值; - 对于
answer
调用,输出答案合法性(Correct / Wrong Answer),,以及你调用query
函数的次数 。
提示
样例交互
样例交互示例如下。
void solve(int N) {
if (N == 2) {
std::vector<int> V = {1, 2};
int qAns = query(V);
if (qAns == 1) {
std::vector<int> P = {1, 2};
answer(P);
}
}
}
数据范围
对于 的数据,保证 。
子任务
编号 | 分值 | |
---|---|---|
计分方式
令调用 query
函数的次数为 。
答案错误,超时,内存超限,运行时错误,得 分。
否则,得分方式按照如下方式计算:
- ,得 测试点满分。
- ,得 倍测试点满分(值域为 ,线性递减)。
- ,得 倍测试点满分(值域为 ,线性递减)。
- ,得 倍测试点满分。
存在得分高于 的官解。