P11105 [ROI 2023] 解密(数据有误) (Day 1)
题目背景
**本题目前数据有误**。
翻译自 [ROI 2023 D1T2](https://neerc.ifmo.ru/school/archive/2022-2023/ru-olymp-roi-2023-day1.pdf)。
这是一道**通信题**。洛谷无法实现通信,所以这道题会使用**函数交互**的形式进行评测。
**不要使用 `C++14 (GCC 9)` 语言提交**。
Alesya 和 Boris 在计算机课上学习密码学。他们决定发明自己的一种加密消息的方法——BASE23(Boris-Alesya Super Encoding 2023)。
Alesya 从 $1$ 到 $n$ 选择了 $k$ 个不同的整数,并将得到的集合称为 $T$。
Alesya 想要以加密形式将集合 $T$ 作为消息传递给 Boris。为此,根据集合 $T$,Alesya 将构建另一个集合 $R$,并将其传递给 Boris,该集合也由整数组成,范围在 $1$ 到 $n$ 之间。
Alesya 和 Boris 不希望加密后的消息大小发生变化(不像 BASE64 一样密文比明文长约 $\frac13$),因此 $R$ 也必须恰好包含 $k$ 个数字。而且,他们认为如果 $T$ 和 $R$ 至少包含一个相同的数,则加密将不够可靠。因此,不应该存在一个既属于 $T$ 又属于 $R$ 的数字,即 $T \cap R = \varnothing$。保证 $k\le \frac{n}{2}$,因此始终可以根据集合 $T$ 构建至少一个集合 $R$。
当 Boris 收到加密消息 $R$ 时,他将需要对其进行解密并获得原始消息 $T$。
题目描述
帮助 Alesya 和 Boris 设计和实现 BASE23 的加密和解密算法。
在本题中,你的程序需要实现下面两个函数(**不需要编写 main 函数**):
```cpp
std::vector Encode(int n, int k, std::vector T){
// 加密过程
return R;
}
std::vector Decode(int n, int k, std::vector R){
// 解密过程
return T;
}
```
你的 `Encode` 函数将扮演 Alesya 的角色,对数组进行加密。而 `Decode` 函数则将扮演 Boris 的角色,通过解密来得到原来的数组。**$T$ 和 $R$ 都按照递增顺序排列**。
刚开始,交互库会根据该数据点的数据调用你编写的 `Encode` 函数,根据它的返回值判断该加密算法是否合法。接着,交互库调用 `Decode` 函数,判断它的返回值是否与原来的数据相同。如果相同,则认为这一份 BASE23 加解密代码是正确的。
交互库会多次调用这两个函数,对应了原题中有多组数据。交互库会先将每组数据的 $T$ 全部加密,接着再按随机顺序把它们解密。具体的数据范围限制见“说明/提示”部分。
输入格式
使用函数交互,程序不需要进行输入。
输出格式
使用函数交互,程序不需要进行输出。
说明/提示
交互库调用两个函数的次数(即数据组数)都不超过 $300000$。对于每一组数据,$2\le n\le 10^9,1\le k\le300000,k\le\frac n2$。对于每一个测试点,$\sum k\le300000$。
原题的加、解密时间限制均为 $1\text{s}$,空间限制均为 $512\text{MB}$,不过由于在洛谷实现通信题的方式特殊,本题由特殊的时空限制。(目前的时空限制可能无法通过本题 qwq)
如果你在本题莫名 CE,你可以尝试换一个语言提交。
当你 UKE 时,查看你的错误提示。如果提示中含有“timeout”,应该是超时了。
交互库编写:@[cff_0102](/user/542457)。