#P11105. [ROI 2023 Day 1] 解密

    ID: 10509 远端评测题 10000ms 1024MiB 尝试: 0 已通过: 0 难度: 5 上传者: 标签>2023交互题Special Judge通信题ROI(俄罗斯)

[ROI 2023 Day 1] 解密

题目背景

翻译自 ROI 2023 D1T2

这是一道通信题。洛谷无法实现通信,所以这道题会使用函数交互的形式进行评测。

本题目前可能无法正常在所有数据范围评测

不要使用 C++14 (GCC 9) 语言提交

Alesya 和 Boris 在计算机课上学习密码学。他们决定发明自己的一种加密消息的方法——BASE23(Boris-Alesya Super Encoding 2023)。

Alesya 从 11nn 选择了 kk 个不同的整数,并将得到的集合称为 TT

Alesya 想要以加密形式将集合 TT 作为消息传递给 Boris。为此,根据集合 TT,Alesya 将构建另一个集合 RR,并将其传递给 Boris,该集合也由整数组成,范围在 11nn 之间。

Alesya 和 Boris 不希望加密后的消息大小发生变化(不像 BASE64 一样密文比明文长约 13\frac13),因此 RR 也必须恰好包含 kk 个数字。而且,他们认为如果 TTRR 至少包含一个相同的数,则加密将不够可靠。因此,不应该存在一个既属于 TT 又属于 RR 的数字,即 TR=T \cap R = \varnothing。保证 kn2k\le \frac{n}{2},因此始终可以根据集合 TT 构建至少一个集合 RR

当 Boris 收到加密消息 RR 时,他将需要对其进行解密并获得原始消息 TT

题目描述

帮助 Alesya 和 Boris 设计和实现 BASE23 的加密和解密算法。

在本题中,你的程序需要实现下面两个函数(不需要编写 main 函数):

std::vector<int> Encode(int n, int k, std::vector<int> T){
	// 加密过程
	return R;
}
std::vector<int> Decode(int n, int k, std::vector<int> R){
	// 解密过程
	return T;
}

你的 Encode 函数将扮演 Alesya 的角色,对数组进行加密。而 Decode 函数则将扮演 Boris 的角色,通过解密来得到原来的数组。TTRR 都按照递增顺序排列

刚开始,交互库会根据该数据点的数据调用你编写的 Encode 函数,根据它的返回值判断该加密算法是否合法。接着,交互库调用 Decode 函数,判断它的返回值是否与原来的数据相同。如果相同,则认为这一份 BASE23 加解密代码是正确的。

交互库会多次调用这两个函数,对应了原题中有多组数据。交互库会先将每组数据的 TT 全部加密,接着再按随机顺序把它们解密。具体的数据范围限制见“说明/提示”部分。

输入格式

使用函数交互,程序不需要进行输入。

输出格式

使用函数交互,程序不需要进行输出。

提示

交互库调用两个函数的次数(即数据组数)都不超过 300000300000。对于每一组数据,2n109,1k300000,kn22\le n\le 10^9,1\le k\le300000,k\le\frac n2。对于每一个测试点,k300000\sum k\le300000

原题的加、解密时间限制均为 1s1\text{s},空间限制均为 512MB512\text{MB},不过由于在洛谷实现通信题的方式特殊,本题由特殊的时空限制。(目前的时空限制可能无法通过本题 qwq)

如果你在本题莫名 CE,你可以尝试换一个语言提交。

当你 UKE 时,查看你的错误提示。如果提示中含有“timeout”,应该是超时了。

交互库编写:

/user/542457