AT_joisc2022_g 壊れた機器 2 (Broken Device 2)
题目描述
这是一道通信题。
### 题意
D-taro 会给 Anna 一个整数,目标就是让 Anna 将这个整数发送给 Bruno。
游戏开始时,Anna 声明了一个在 $1$ 到 $2000$ 之间的整数 $m$,接下来他们玩 $Q$ 轮游戏。第 $i$ 轮游戏的过程如下:
1. D-taro 向 Anna 给出一个整数 $A_i$。
2. Anna 向通信设备输入两个数组 $s_i,t_i$,数组的每个元素 $s_i,t_i$ 应当是 $0$ 或 $1$,并且两者的长度相同且均为某个 $1$ 到 $m$ 之间的整数。
3. 令 $u_i$ 为 $s_i$ 和 $t_i$ 经过**乱序归并**得到的结果,通信设备会向 Bruno 发送 $u_i$。
4. Bruno 告诉 D-taro 一个整数,如果这个整数和 $A_i$ 相同,Anna 和 Bruno 在这轮获胜。
以下是**乱序归并**的定义:
我们称数组 $Z$ 是数组 $X$ 和数组 $Y$ 经过乱序归并得到的结果当且仅当:存在一种划分方式,将 $Z$ 中的元素划成两个集合,满足:
- 第一个集合中的元素按在 $Z$ 中的位置顺次连接得到的数组是 $X$。
- 第二个集合中的元素按在 $Z$ 中的位置顺次连接得到的数组是 $Y$。
例如:数组 $[\underline{1},\underline{1},1,0,0,\underline{0}]$ 可以由数组 $[1,1,0]$ 和数组 $[1,0,0]$ 乱序归并得到。
请你实现 Anna 和 Bruno 的策略。
### 任务
你需要提交一份源文件,包括以下两个部分。
#### Anna
你必须引用 `Anna.h`。
这份代码需要实现 Anna 的策略,因此你需要实现如下过程:
```cpp
int Declare();
```
这个函数会在每个测试点评测开始时被调用一次。
函数的返回值是 Anna 声明的 $m$。$m$ 必须是 $1$ 到 $2000$ 之间的整数,否则程序将被判为 `Wrong Answer [1]`。
```cpp
std::pair < std::vector , std::vector > Anna(long long A);
```
在 `Declare` 被调用后,这个函数会被调用 $Q$ 次。第 $i$ 次调用对应第 $i$ 轮游戏的前两轮之间。
参数 $\texttt{A}$ 表示 D-taro 向 Anna 给出的整数。
这个函数的返回值应当是两个数组 $s_i,t_i$,即 Anna 向通信设备输入的字符串。$s_i,t_i$ 应当只包含字符 0 或 1,否则程序将被判为 `Wrong Answer [2]`。
数组 $s_i,t_i$ 的长度应当在 $1$ 和 $m$ 之间,否则程序将被判为 `Wrong Answer [3]`。数组 $s_i,t_i$ 应当具有相同的长度,否则程序将被判为 `Wrong Answer [4]`。
#### Bruno
你必须引用 `Bruno.h`。
这份代码需要实现 Bruno 的策略,因此你需要实现如下过程:
```cpp
long long Bruno(std::vector u);
```
每当 Anna 将数组对输入设备,调用该函数一次,因此这个函数的第 $i$ 次调用对应游戏第 $i$ 轮的第 $3$ 步和第 $4$ 步之间的过程。
参数 $\texttt{u}$ 是第 $i$ 轮中,Bruno 接收到的字符串 $u_i$。返回值是 Bruno 向 D-taro 给出的数。返回值应当与 D-taro 向 Anna 给出的相同,否则你的程序将被判为 `Wrong Answer [5]`。
### 样例评测库
见附件下载中的 grader.cpp。
你可以通过如下命令编译样例交互库:
```cpp
g++ -std=gnu++17 -O2 -o grader grader.cpp Anna.cpp Bruno.cpp
```
输入格式
第一行一个整数 $Q$。
接下来 $Q$ 行每行一个整数 $A_i$。
输出格式
如果你的程序正确运行,样例交互库将会输出形如 `Accepted: m` 的信息,其中
$m$ 为 Declare 的返回值。
否则会输出形如 `Wrong Answer [x]` 的信息返回错误编号。
说明/提示
样例评测库的乱序归并是使用伪随机数完成的,这意味着重复允许程序,乱序归并的方式是相同的。你可以通过添加运行参数来改变伪随机数种子,例如:
```cpp
./grader 2022
```
### 样例
#### input
```cpp
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\leq Q\leq 1000$
- $1\leq A_i\leq 10^{18}$
#### Subtasks
- $\text{(5 points) } A_i\leq 2000$
- $\text{(5 points) } A_i\leq 4\times 10^6$
- $\text{(3 points) } A_i\leq 10^7$
- $\text{(12 points) } A_i\leq 10^8$
- $\text{(15 points) } A_i\leq 10^{11}$
- $\text{(60 points)}$ 无特殊限制,评分方式如下:
这个子任务的得分是所有测试点得分的最小值。
对于某个测试点,他的得分由 $m$ 决定,如下表:
|$m$ |得分 |
| :-----------: | :-----------: |
|$201\leq m\leq 2000$ |$40-25\times \log_{10}\left(\frac{m}{200}\right)$|
|$161\leq m\leq 200$ |$40$|
|$156\leq m\leq 160$ |$44$|
|$151\leq m\leq 155$ |$48$|
|$146\leq m\leq 150$ |$52$|
|$141\leq m\leq 145$ |$56$|
|$m\leq 140$ |$60$|
保证得分的交互过程中,交互库分别不会使用超过 $\texttt{0.5s}$ 时间和 $\texttt{32MB}$ 空间。
时间限制:两份程序分别 $\texttt{2s}$。
空间限制:两份程序分别 $\texttt{512MB}$。
[附件](https://uoj.ac/download/problem/728/attachment.zip)