T686510 [CFCOI-R3.5-T1] 猜数(guess)
题目背景
:::info[题目信息]
- 出题人:[Hamburger999](https://www.luogu.com.cn/user/1045301)
- 数据:[Hamburger999](https://www.luogu.com.cn/user/1045301)
Hint: 此题就是题目描述长,并不难。
$\text{guess.cpp},1 \text{ s},512 \text{ MiB}$
:::
**这是一道交互题。**
你可以在下面 $0 \ \text{pts}$ 示例程序中编辑:
```cpp
#include
using namespace std;
extern "C" vector init(int n){
return {};
}
extern "C" vector guess(int n,vector b){
return {};
}
```
题目描述
小 A 和小 B 正在玩游戏。
小 A 有一个长度为 $n$ 的整数序列 $a_0,a_1,\cdots,a_{n-1}$。小 B 不知道这个序列。
小 A 将 $a$ 序列复制了一份得到 $b$ 序列。然后小 B 最多可以进行 $k$ 次操作,第 $i$ 次操作选择 $x_i,y_i$,然后小 A 会将 $b_{y_i}$ 减去 $a_{x_i}$。
小 B 的操作需要保证:
+ 对于 $0 \le i < n$ 的每个整数 $i$,至少存在一个 $j$ 使得 $x_j=i$。
+ 对于 $0 \le i < n$ 的每个整数 $i$,至少存在一个 $k$ 使得 $y_k=i$。
最后小 A 会告诉小 B 最终的 $b$ 序列,你要扮演小 B 的角色进行操作,并根据最终的 $b$ 序列还原 $a$ 序列。
#### 交互说明
你需要实现函数 `std::vector init(int n)`:
该函数接收 $1$ 个整数 $n$,返回小 B 的操作序列。该序列由若干个二元组 $(x_i,y_i)$ 组成。这个序列的长度应当不超过 $k$。
你需要实现函数 `std::vector guess(int n,std::vector b)`:
这个函数接收小 B 收到的 $1$ 个整数 $n$ 和最终的 $b$ 序列,你应当返回你求出的 $a$ 序列。
你不应该,也无需实现主函数。
输入格式
你无法读入输入文件。
输入文件包含 $2$ 个整数 $n,k$。序列 $a$ 将在程序内部均匀随机生成。
输出格式
你无需实现主函数,也无需有任何输出。
说明/提示
#### 一个可能的交互过程
交互库接收到 $n=1,k=2$,初始化 $a=\{233\}$。调用 `init(1)`。返回值为 `{{0,0}}`。
交互库检查操作序列的合法性。这个操作序列合法。
交互库按照操作序列操作,得到序列 $b=\{0\}$。
交互库调用 `guess(1,{0})`,由于你的运气好,恰好返回了 `{233}`。
这个返回的序列与 $a$ 相同,你通过了这个测试点。
#### 数据范围
对于 $100\%$ 的数据,$1 \le n \le 3 \times 10^5,|a_i| \le 10^5,k \ge n+1$。
本题共 $10$ 个测试点,测试点数据范围如下:
::cute-table{tuack}
| 测试点编号 | $n=$ | $k=$ |
|:-:|:-:|:-:|
| $1$ | $1$ | $2$ |
| $2 \sim 4$ | $3 \times 10^5$ | $2n$ |
| $5 \sim 10$ | ^ | $n+1$ |
#### 评分方式
如果生成的操作序列长度 $>k$ 或者不符合题目要求,得 $0$ 分。
如果还原的 $a$ 序列不正确,得 $0$ 分。
如果操作序列符合要求并且还原的 $a$ 序列正确,得满分。