#P1085. 【UR #34】摄神取念

【UR #34】摄神取念

这是一道交互题。仅支持使用 C++ 语言提交。

伏地魔有一个秘密计划,具体地,这个秘密计划形如一个长度为 $N$($N\ge3$)的排列,第 $i$ 个数为 $p_i$,且其满足 $\mathbf{p_1 =1}$

而你,作为一个精通摄神取念的傲罗,活捉了知晓这个计划的食死徒小 S,并打算对其使用摄神取念来知晓这个计划。

记 $f(l,r)=\max_{l\le i\le r}p_i-\min_{l\le i\le r}p_i,g(l,r)=[f(l,r)=f(l,r-1)],h(l,r)=[f(l,r)=f(l+1,r)]$。

总共有 $A$、$B$ 和 $C$ 三类摄神取念,每次摄神取念,你可以选择其中的一类:

  • 若你选择进行 $A$ 类摄神取念,则你还需要选择两个整数 $l,r$,满足 $1\le l < r\le N$,并得知 $g(l,r)$ 的值;
  • 若你选择进行 $B$ 类摄神取念,则你还需要选择两个整数 $l,r$,满足 $1\le l < r\le N$,并得知 $h(l,r)$ 的值(注意:在一些子任务中你无法使用该操作,具体见数据范围);
  • 若你选择进行 $C$ 类摄神取念,则你还需要选择两个整数 $l,r$,满足 $1\le l \le r\le N$,并得知 $f(l,r)$ 的值。

但是,摄神取念会对小 S 的记忆产生永久性的伤害。因此,你无法在使用过 $C$ 类摄神取念之后使用另外两类,且你分别最多使用 $k_A$、$k_B$ 和 $N-1$ 次 $A$、$B$ 和 $C$ 类摄神取念,否则小 S 将会永久遗忘这个计划。

现在,请你回答这个秘密计划。

实现细节

你需要包含头文件 legilimency.h

你需要实现以下函数来回答秘密计划:

std::vector<int> solve(int N, int k_A, int k_B);
  • $N$:秘密计划的长度。
  • $k_A,k_B$:$A$ 和 $B$ 类摄神取念的最高使用次数。
  • 返回一个包含 $N+1$ 个 intstd::vector。其中开头的元素会被交互库忽略,接下来每个数,第 $i$ 个数为你回答的 $p_i$。

你可以调用以下三种函数来进行一次 $A$、$B$ 和 $C$ 类摄神取念:

int legilimency_A(int l, int r);
int legilimency_B(int l, int r);
int legilimency_C(int l, int r);
  • $l,r$:这次摄神取念选择的两个整数。
  • 返回这次摄神取念你得到的值。

交互库是非自适应的:在一次测试中,秘密计划对应的排列在测试开始前已经确定,且不会因你的询问内容或顺序而发生改变。

评测程序示例输入格式:

第一行一个整数 $T$,表示数据组数。

对于每组数据:

第一行,三个非负整数 $N,k_A,k_B$,分别表示秘密计划的长度和 $A$、$B$ 类摄神取念的最高使用次数。

第二行 $N$ 个正整数,第 $i$ 个数表示 $p_i$。

1
3 10000000 1000000
1 2 3
Accepted

如何测试你的程序

在终端下输入如下命令进行编译:

g++ grader.cpp legilimency.cpp -o legilimency -O2 -std=c++14

生成的可执行文件将从 legilimency.in 读入数据,并在 legilimency.out 输出。

数据范围

对于所有测试数据,满足 $3\le N\le 5\times 10^5, \sum N \le 5 \times 10^5,k_A \ge 2N$。

子任务编号 分值 $\sum N \le$ $k_A=$ $k_B=$
$1$ $5$ $18$ $\frac{N(N-1)}{2}$ $\frac{N(N-1)}{2}$
$2$ $10$ $5\times10^5$ $2N$ $N$
$3$ $15$ $2000$ $\frac{N(N-1)}{2}$ $0$
$4$ $10$ $5\times10^5$ $20N$
$5$ $15$ $4N$
$6$ $15$ $3N$
$7$ $30$ $2N$

保证在合法的交互次数内,交互库的运行时间不超过 $\texttt{0.1s}$。

时间限制:$\texttt{1s}$

空间限制:$\texttt{512MB}$