P11884 [RMI 2024] 拉面 / Ramen
题目背景
在洛谷上评测时,将如下内容粘贴至文件头:
```cpp
std::vector find_order(int N);
std::vector query(const std::vector& order);
```
我们在附件中提供了模板文件,你可以在该文件的基础上开始编辑。
题目描述
**这是一道函数式交互题。**
有 $n$ 人,编号 $0\sim n-1$。有 $n$ 种拉面,编号 $0\sim n-1$。
第 $i$ 个人对第 $j$ 种拉面的**喜爱度**为整数 $A_{i,j}$。$A_{i,j}$ 越大,她对拉面 $j$ 越喜欢。**保证 $\forall 0\le p\lt q\le n-1$,都有 $A_{i,p}\neq A_{i,q}$。** 注意 $A_{i,j}$ 可以 $\lt 0$。
由于拉面存量不够,每种拉面仅供一人享用。设想这 $n$ 个人以 $\pi_0,\pi_1,\ldots,\pi_{n-1}$(显然 $\pi$ 是一个排列)的顺序点餐,首先第 $\pi_0$ 个人会点她最喜欢的拉面,然后 $\pi_1$ 会选择没被 $\pi_0$ 点过的拉面中,她最喜欢的拉面,以此类推。
换句话说,第 $\pi_i$ 个人会选择第 $\pi_0,\pi_1,\ldots,\pi_{i-1}$ 个人没点过的拉面中,她最喜欢的拉面。
对于排列 $\pi$,设 $\sigma(i)$ 为第 $i$ 个人点的拉面,定义排列 $\pi$ 的**愉悦度**为 $\displaystyle \sum_{0\le i\lt n} A_{i,\sigma(i)}$。
你可以进行至多 $750$ 次询问:每次询问给定排列 $\pi$,交互库会返回 $n$ 个二元组,第 $i$ 个二元组为 $(\sigma(i),A_{i,\sigma(i)})$。目标是找到一个排列 $\pi$,最大化其愉悦度。
### 实现细节
你不需要,也不应该实现 `main` 函数。
你需要实现以下的函数:
```cpp
std::vector find_order(int n);
```
- 参数 $n$:人数和拉面种类数。
- 返回一个排列 $\pi_0,\pi_1,\ldots,\pi_{n-1}$。
你可以调用以下的函数:
```cpp
std::vector query(const std::vector& order);
```
- 参数 $\mathrm{order}$:一个排列 $\pi_0,\pi_1,\ldots,\pi_{n-1}$。
- 返回 $n$ 个二元组,第 $i$ 个二元组为 $(\sigma(i),A_{i,\sigma(i)})$,表示在给定排列下,第 $i$ 个人会吃第 $\sigma(i)$ 种拉面,以及她对第 $\sigma(i)$ 种拉面的喜爱度。
在洛谷上评测时,将如下内容粘贴至文件头:
```cpp
std::vector find_order(int N);
std::vector query(const std::vector& order);
```
输入格式
见【实现细节】。
输出格式
见【实现细节】。
说明/提示
### 样例交互
| 交互库 | 选手程序 |
| - | - |
| 调用 `find_order(2)` | |
| | `query({0,1})` |
| `{{0, 9}, {1, 0}}` | |
| | `query({1, 0})` |
| `{{1, 5}, {0, 5}}` | |
| | 返回 `{1,0}` |
在该样例中,$A_{0}=[9,5]$,$A_1=[5,0]$。显然 $\pi=[1,0]$ 可以达成最大的愉悦度 $5+5=10$。
### 数据范围
对于 $100\%$ 的数据,保证:
- $1\le n\le 75$;
- $|A_{i,j}|\le 2\times 10^6$。
std 至多会询问 $c\cdot n^k$ 次,其中 $c,k$ 是某个不小于 $1$ 的常数。
---
| 子任务 | $n=$ | 得分 |
| :-: | :-: | :-: |
| $1$ | $5$ | $5$ |
| $2$ | $15$ | $15$ |
| $3$ | $30$ | $20$ |
| $4$ | $45$ | $20$ |
| $5$ | $60$ | $20$ |
| $6$ | $75$ | $20$ |