#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$ 个
int的std::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}$