#P11884. [RMI 2024] 拉面 / Ramen

    ID: 11549 远端评测题 1000ms 256MiB 尝试: 0 已通过: 0 难度: 6 上传者: 标签>2024交互题Special JudgeRMI(罗马尼亚)

[RMI 2024] 拉面 / Ramen

题目背景

在洛谷上评测时,将如下内容粘贴至文件头:

std::vector<int> find_order(int N);

std::vector<std::pair<int, int>> query(const std::vector<int>& order);

我们在附件中提供了模板文件,你可以在该文件的基础上开始编辑。

题目描述

这是一道函数式交互题。

nn 人,编号 0n10\sim n-1。有 nn 种拉面,编号 0n10\sim n-1

ii 个人对第 jj 种拉面的喜爱度为整数 Ai,jA_{i,j}Ai,jA_{i,j} 越大,她对拉面 jj 越喜欢。保证 0p<qn1\forall 0\le p\lt q\le n-1,都有 Ai,pAi,qA_{i,p}\neq A_{i,q} 注意 Ai,jA_{i,j} 可以 <0\lt 0

由于拉面存量不够,每种拉面仅供一人享用。设想这 nn 个人以 π0,π1,,πn1\pi_0,\pi_1,\ldots,\pi_{n-1}(显然 π\pi 是一个排列)的顺序点餐,首先第 π0\pi_0 个人会点她最喜欢的拉面,然后 π1\pi_1 会选择没被 π0\pi_0 点过的拉面中,她最喜欢的拉面,以此类推。

换句话说,第 πi\pi_i 个人会选择第 π0,π1,,πi1\pi_0,\pi_1,\ldots,\pi_{i-1} 个人没点过的拉面中,她最喜欢的拉面。

对于排列 π\pi,设 σ(i)\sigma(i) 为第 ii 个人点的拉面,定义排列 π\pi愉悦度0i<nAi,σ(i)\displaystyle \sum_{0\le i\lt n} A_{i,\sigma(i)}

你可以进行至多 750750 次询问:每次询问给定排列 π\pi,交互库会返回 nn 个二元组,第 ii 个二元组为 (σ(i),Ai,σ(i))(\sigma(i),A_{i,\sigma(i)})。目标是找到一个排列 π\pi,最大化其愉悦度。

实现细节

你不需要,也不应该实现 main 函数。

你需要实现以下的函数:

std::vector<int> find_order(int n);
  • 参数 nn:人数和拉面种类数。
  • 返回一个排列 π0,π1,,πn1\pi_0,\pi_1,\ldots,\pi_{n-1}

你可以调用以下的函数:

std::vector<std::pair<int, int>> query(const std::vector<int>& order);
  • 参数 order\mathrm{order}:一个排列 π0,π1,,πn1\pi_0,\pi_1,\ldots,\pi_{n-1}
  • 返回 nn 个二元组,第 ii 个二元组为 (σ(i),Ai,σ(i))(\sigma(i),A_{i,\sigma(i)}),表示在给定排列下,第 ii 个人会吃第 σ(i)\sigma(i) 种拉面,以及她对第 σ(i)\sigma(i) 种拉面的喜爱度。

在洛谷上评测时,将如下内容粘贴至文件头:

std::vector<int> find_order(int N);

std::vector<std::pair<int, int>> query(const std::vector<int>& order);

输入格式

见【实现细节】。

输出格式

见【实现细节】。

提示

样例交互

交互库 选手程序
调用 find_order(2)
query({0,1})
{{0, 9}, {1, 0}}
query({1, 0})
{{1, 5}, {0, 5}}
返回 {1,0}

在该样例中,A0=[9,5]A_{0}=[9,5]A1=[5,0]A_1=[5,0]。显然 π=[1,0]\pi=[1,0] 可以达成最大的愉悦度 5+5=105+5=10

数据范围

对于 100%100\% 的数据,保证:

  • 1n751\le n\le 75
  • Ai,j2×106|A_{i,j}|\le 2\times 10^6

std 至多会询问 cnkc\cdot n^k 次,其中 c,kc,k 是某个不小于 11 的常数。


子任务 n=n= 得分
11 55
22 1515
33 3030 2020
44 4545
55 6060
66 7575