#P14717. [RMI 2025] 猜排列 / Guess Permutation

    ID: 14620 远端评测题 4000ms 2048MiB 尝试: 0 已通过: 0 难度: 8 上传者: 标签>二分2025交互题Special Judge期望RMI(罗马尼亚)

[RMI 2025] 猜排列 / Guess Permutation

Description

这是一道交互题。本题中,交互库是非自适应的。

有一台破旧的机器,有 NN隐藏的开关,编号 0N10\sim N-1。开关的状态用 s0,,sN1s_0,\ldots,s_{N-1} 来表示。我们说开关 ii 断开,当且仅当 si=0s_i=0;否则 si=1s_i=1,开关 ii 接通

起初,所有开关都是断开的。

NN 个按钮,编号 0N10\sim N-1。有一个隐藏的 0N10\sim N-1 的排列,记为 P=[p0,,pN1]P=[p_0,\ldots,p_{N-1}]

现在想要确定 PP。为此,你可以进行如下的操作:

操作

  • 选定 ii 满足 0i<n0\le i\lt n,按下按钮 ii
  • 令本次操作(不含本次)一共进行了 kk 次操作。
  • 翻转开关 pkmodNp_{k\bmod N} 的状态。形式化地,令 spkmodN1spkmodNs_{p_{k\bmod N}}\gets 1-s_{p_{k\bmod N}}
  • 你将得知 sis_i 的值。

给定 NN,你需要用至多 50N50N 次操作找出排列 PP

为了获得满分,需要更少的操作次数,详见「计分方式」。

实现细节

这是一道(函数式)交互题。你不需要,也不应该定义 main 函数。

你需要实现函数

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

该函数接收参数 NN;返回长度为 NNvector qq 满足 q[i]=p[i]q[i]=p[i]。该函数每个测试点仅调用一次。

你可以调用以下的函数:

int press_button(int i);

描述一次按下按钮 ii 的操作,返回操作后 sis_i 的值。

Sample Grader

在附件中附有 sample grader(sample-grader.cpp\texttt{sample-grader.cpp})。其输入格式如下:

  • 第一行:正整数 NN
  • 第二行:NN 个整数 p0,p1,,pN1p_0,p_1,\ldots,p_{N-1}

它会调用 solve(N) 函数,报告你程序的运行结果:若通过,输出查询次数;否则,输出错误信息。

Input Format

见「实现细节」。

Output Format

见「实现细节」。

Hint

样例解释

考虑 N=4,P=[1,3,0,2]N=4,P=[1,3,0,2] 和以下的调用。

操作 S=S= 返回值
press_button(0)\texttt{press\_button(0)} 0100\texttt{0100}  \texttt{ }
press_button(1)\texttt{press\_button(1)} 0101\texttt{0101} 0\texttt{0}
press_button(2)\texttt{press\_button(2)} 1101\texttt{1101} 1\texttt{1}
press_button(3)\texttt{press\_button(3)} 1111\texttt{1111} 0\texttt{0}
press_button(1)\texttt{press\_button(1)} 1011\texttt{1011} 1\texttt{1}
press_button(3)\texttt{press\_button(3)} 1010\texttt{1010} 0\texttt{0}
press_button(2)\texttt{press\_button(2)} 0010\texttt{0010}
返回 {1,3,0,2}\texttt{\{1,3,0,2\}} 1\texttt{1}

限制条件

  • N104N\le 10^4
  • PP0N10\sim N-1 的排列。

子任务

# 得分 N=N=
11 2020 3232
22 4040 10001\, 000
33 1000010\, 000

计分方式

如果你的程序未能成功结束,或者答案错误,得 00 分。

否则,令 KK 为你的程序调用 press_button() 的次数。令 Q=K/NQ=K/N,若 Q>50Q>50,得 00 分。否则,每个子任务得分为系数 SS 乘以子任务满分。SS 的计算方式如下:

  • 子任务 11:$\displaystyle S=\begin{cases} \displaystyle 1, & Q\le 7 \\ \displaystyle 1-\frac{1}{10}(Q-7), & 7\lt Q\le 12 \\ \displaystyle \frac{1}{2}-\frac{1}{100}(Q-12), & 12\lt Q\le 32 \\ \displaystyle \frac{3}{10}-\frac{1}{10}\sqrt[4]{\frac{Q-32}{18}}, & 32\lt Q\le 50\end{cases}$
  • 子任务 22:$\displaystyle S=\begin{cases} \displaystyle 1, & Q\le 13 \\ \displaystyle \frac{1}{2}+\frac{1}{2}\left(\frac{23-Q}{10}\right)^2, & 13\lt Q\le 23 \\ \displaystyle \frac{1}{5}+\frac{3}{10}\sqrt{\frac{50-Q}{27}}, & 23\lt Q\le 50\end{cases}$
  • 子任务 33:$\displaystyle S=\begin{cases} \displaystyle 1, & Q\le 17 \\ \displaystyle \frac{3}{5}+\frac{25-Q}{20}, & 17\lt Q\le 25 \\ \displaystyle \frac{1}{5}+\frac{2}{5}\left(\frac{50-Q}{25}\right)^2, & 25\lt Q\le 50\end{cases}$

你可以利用下图获得直观感受。

::::align{center} ::::