AT_joisc2022_g.壊れた機器 2 (Broken Device 2)
NOI/NOI+/CTSC
通过率:0%
AC君温馨提醒
该题目为【atcoder】题库的题目,您提交的代码将被提交至atcoder进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
这是一道通信题。
题意
D-taro 会给 Anna 一个整数,目标就是让 Anna 将这个整数发送给 Bruno。
游戏开始时,Anna 声明了一个在 1 到 2000 之间的整数 m,接下来他们玩 Q 轮游戏。第 i 轮游戏的过程如下:
-
D-taro 向 Anna 给出一个整数 Ai。
-
Anna 向通信设备输入两个数组 si,ti,数组的每个元素 si,ti 应当是 0 或 1,并且两者的长度相同且均为某个 1 到 m 之间的整数。
-
令 ui 为 si 和 ti 经过乱序归并得到的结果,通信设备会向 Bruno 发送 ui。
-
Bruno 告诉 D-taro 一个整数,如果这个整数和 Ai 相同,Anna 和 Bruno 在这轮获胜。
以下是乱序归并的定义:
我们称数组 Z 是数组 X 和数组 Y 经过乱序归并得到的结果当且仅当:存在一种划分方式,将 Z 中的元素划成两个集合,满足:
- 第一个集合中的元素按在 Z 中的位置顺次连接得到的数组是 X。
- 第二个集合中的元素按在 Z 中的位置顺次连接得到的数组是 Y。
例如:数组 [1,1,1,0,0,0] 可以由数组 [1,1,0] 和数组 [1,0,0] 乱序归并得到。
请你实现 Anna 和 Bruno 的策略。
任务
你需要提交一份源文件,包括以下两个部分。
Anna
你必须引用 Anna.h。
这份代码需要实现 Anna 的策略,因此你需要实现如下过程:
int Declare();
这个函数会在每个测试点评测开始时被调用一次。
函数的返回值是 Anna 声明的 m。m 必须是 1 到 2000 之间的整数,否则程序将被判为 Wrong Answer [1]。
std::pair < std::vector <int>, std::vector <int> > Anna(long long A);
在 Declare 被调用后,这个函数会被调用 Q 次。第 i 次调用对应第 i 轮游戏的前两轮之间。
参数 A 表示 D-taro 向 Anna 给出的整数。
这个函数的返回值应当是两个数组 si,ti,即 Anna 向通信设备输入的字符串。si,ti 应当只包含字符 0 或 1,否则程序将被判为 Wrong Answer [2]。
数组 si,ti 的长度应当在 1 和 m 之间,否则程序将被判为 Wrong Answer [3]。数组 si,ti 应当具有相同的长度,否则程序将被判为 Wrong Answer [4]。
Bruno
你必须引用 Bruno.h。
这份代码需要实现 Bruno 的策略,因此你需要实现如下过程:
long long Bruno(std::vector <int> u);
每当 Anna 将数组对输入设备,调用该函数一次,因此这个函数的第 i 次调用对应游戏第 i 轮的第 3 步和第 4 步之间的过程。
参数 u 是第 i 轮中,Bruno 接收到的字符串 ui。返回值是 Bruno 向 D-taro 给出的数。返回值应当与 D-taro 向 Anna 给出的相同,否则你的程序将被判为 Wrong Answer [5]。
样例评测库
见附件下载中的 grader.cpp。
你可以通过如下命令编译样例交互库:
g++ -std=gnu++17 -O2 -o grader grader.cpp Anna.cpp Bruno.cpp
输入格式
第一行一个整数 Q。
接下来 Q 行每行一个整数 Ai。
输出格式
如果你的程序正确运行,样例交互库将会输出形如 Accepted: m 的信息,其中
m 为 Declare 的返回值。
否则会输出形如 Wrong Answer [x] 的信息返回错误编号。
说明/提示
样例评测库的乱序归并是使用伪随机数完成的,这意味着重复允许程序,乱序归并的方式是相同的。你可以通过添加运行参数来改变伪随机数种子,例如:
./grader 2022
样例
input
2
42
2000
explanation
| 函数调用 | 返回值 |
|---|---|
| Declare() | 4 |
| Anna(42) | ([0, 0, 1, 0], [1, 1, 0, 1]) |
| Bruno([1, 0, 0, 1, 0, 1, 0, 1]) | 42 |
| Anna(2000) | ([0, 1], [0, 0]) |
| Bruno([0, 0, 1, 0]) | 2000 |
在这组样例中,进行了 Q(=2) 轮游戏。
数据范围与评分方式
- 1≤Q≤1000
- 1≤Ai≤1018
Subtasks
- (5 points) Ai≤2000
- (5 points) Ai≤4×106
- (3 points) Ai≤107
- (12 points) Ai≤108
- (15 points) Ai≤1011
- (60 points) 无特殊限制,评分方式如下:
这个子任务的得分是所有测试点得分的最小值。
对于某个测试点,他的得分由 m 决定,如下表:
| m | 得分 |
|---|---|
| 201≤m≤2000 | 40−25×log10(200m) |
| 161≤m≤200 | 40 |
| 156≤m≤160 | 44 |
| 151≤m≤155 | 48 |
| 146≤m≤150 | 52 |
| 141≤m≤145 | 56 |
| m≤140 | 60 |
| 保证得分的交互过程中,交互库分别不会使用超过 0.5s 时间和 32MB 空间。 |
时间限制:两份程序分别 2s。
空间限制:两份程序分别 512MB。
输入解题思路,AI测评打分。不知道怎么写?