P7805 [JOI Open 2021] 怪兽游戏 / Monster Game

题目背景

**本题为交互题。** 交互库与 spj 提供者 @[Liking_Cpp_In_Luogu](https://www.luogu.com.cn/user/705620),感谢他的贡献! 请不要在代码中加入头文件 `monster.h`,在 Solve 函数前加上 `extern "C"`,开头加上 `extern "C" bool Query(int,int);` 即可。

题目描述

你圈养了 $N$ 只书虫,这 $N$ 只书虫编号为 $0 \sim N-1$,第 $i$ 只书虫的力量值为 $S_i$,满足 $S_i \in [0,N-1]$,且没有两只书虫的力量值是相等的。 你可以调用最多 $25000$ 次「打架事件」: - 选择两只编号不相同的书虫 $a,b$: - 如果 $|S_a-S_b|=1$,则力量值小的书虫获胜; - 如果 $|S_a-S_b|>1$,则力量值大的书虫获胜。 请最小化调用「打架事件」的次数,你可以得到每次「打架事件」的结果,求所有书虫的力量值。 #### 交互格式 你的程序需要实现以下函数: - `std::vector Solve(int N)` - 对于每组数据,该函数只能被调用一次; - $N$:书虫的个数; - 该函数返回这 $N$ 只书虫的力量值数组 $T$; - 应该满足 $|T|=N$,否则您的程序将会被判为 `Wrong Answer [1]`; - 应该满足 $T_i\in [0,N-1]$,否则您的程序将会被判为 `Wrong Answer [2]`; - 应该满足 $T_i=S_i$,否则您的程序将会被判为 `Wrong Answer [3]`。 你的程序可以调用以下函数: - `bool Query(int a, int b)` - 你可以用这个函数调用「打架事件」; - $a,b$:书虫 $a$ 与书虫 $b$ 打架; - 如果 $a$ 获胜了,则返回 `true` 否则返回 `false`; - 应该满足 $a \in [0,N-1]\land b \in [0,N-1]$,否则您的程序将会被判为 `Wrong Answer [4]`; - 应该满足 $a \ne b$,否则您的程序将会被判为 `Wrong Answer [5]`; - 调用 `Query` 函数应该不超过 $25000$ 次。否则您的程序将会被判为 `Wrong Answer [6]`。 **特殊说明** 1. 您的程序可以调用其他标准库里的函数,或者使用全局变量; 2. 您的程序不得使用标准输入与标准输出。

输入格式

见「交互格式」。

输出格式

见「交互格式」。

说明/提示

#### 样例 1 解释 样例的交互过程: |调用|返回|调用|返回| |:-:|:-:|:-:|:-:| |`Solve(5)`|||| |||`Query(1, 0)`|`false`| |||`Query(4, 0)`|`false`| |||`Query(1, 3)`|`true`| ||`[3, 1, 4, 2, 0]`|| #### 评测程序示例(样例) 评测程序示例以如下格式读取输⼊数据: 第一行:$N$ 第二行:$S_0\ S_1\ \cdots\ S_{N-1}$ 评测程序示例以如下格式读取输出数据: 当程序成功结束运行后,样例交互器会在标准输出中输出以下内容: - 如果你的程序被判为正确,样例交互器会输出类似 `Accepted: 100` 的信息,其中 $100$ 为你的程序调用 `Query` 函数的次数; - 如果你的程序被判为错误,样例交互器的输出内容已在「交互格式」中描述。 如果你的程序有多数错误,样例交互器只会判断其中的一种。 注意,交互器在某些数据中是自适应性的,也就是实际的交互器刚开始并没有一个确定的答案,而是会随着之前 `Query` 函数的调用逐渐做出响应,能保证至少有一组答案满足交互库做出的响应。 (本来原题有一个工具可以用来检测,但是找不到检测文件了,所以就咕掉了) #### 数据规模与约定 **本题采用捆绑测试。** - Subtask 1(10 pts):$N \le 200$; - Subtask 2(15 pts):实际使用的交互库并不是自适应性的; - Subtask 3(75 pts):无特殊限制。 对于 $100\%$ 的数据: - $4 \le N \le 1000$; - $0 \le S_i \le N-1$; - $S_i$ 保证互不相同。 对于 Subtask 3,特有一套评分标准: 如果你的程序通过了所有测试数据,那: - 设 $X$ 为 Subtask 3 中你的程序对每个测试点调用的 `Query` 函数的次数的最大值; - 你的分数将按照下面的过程计算: - 如果 $10^4