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$ |