#P10204. [湖北省选模拟 2024] 白草净华 / buer

[湖北省选模拟 2024] 白草净华 / buer

题目背景

由于洛谷评测环境限制,请勿使用 C++ 14 (GCC 9) 语言提交本题,否则可能会导致编译错误。

这是一道交互题。

神明只送给人类填饱肚子的知识,人类却借此制作了工具,书写了文字,壮大了城邦,现在又放眼星辰与深渊……

他们每时每刻都在创造全新的「知识」,也令我再也无法移开双眼。

我自认为我擅长提问和回答问题,但我渐渐明白,有很多人是揣着明白装糊涂,问题的答案并不能帮上他们的忙。是不是随着年龄增长,大家都会失去面对质问和答案的勇气呢……

题目描述

智慧之神布耶尔的知识可以用长度为 NN 的数列 a0,a1,,aN1a_0,a_1,\cdots,a_{N-1} 表示(请注意,下标从 00 开始)。很遗憾,凡人难以窥探智慧之神的知识,你既不知道 NN 的大小,又不知道任何 aia_i 的值。

智慧之神是善良的,纳西妲愿意告诉你关于知识的一切:

  • 对于任意的 0i<N0 \le i < Naia(i+1)modNa_i \neq a_{(i+1)\bmod N}
  • 有且仅有一个 i(0i<N)i(0 \le i < N),使 ai>a(i+1)modNa_i>a_{(i+1)\bmod N}ai>a(i+N1)modNa_i > a_{(i+N-1)\bmod N} 同时成立。

你可以向智慧之神提问,每次提问,你可以向纳西妲提供一个 01090\sim10^9 范围内的整数 kk,纳西妲将回答你 a(d+k)modNa_{(d+k)\bmod N} 的值。其中,dd 是上一次纳西妲回答的元素的下标。dd 的初始值设定为 00。例如,N=5N=5,你依次向纳西妲提供了 1,2,31,2,3,纳西妲回答的数字依次为 a1,a3,a1a_1,a_3,a_1

你有 333333 次提问的机会,你需要求出数列 aa 中的最大值。

你,还有质问与提问的勇气吗?

实现细节

交互库实现了如下函数,选手需要在程序中声明这些函数,但不应该实现其函数体

int ask(int k);
  • 这个函数返回 a(d+k)modNa_{(d+k)\bmod N} 的值,并将 dd 的值修改为 d+kd+k
int cheat();
  • 这个函数返回 NN 的值。
  • 调用该函数,将不能得到测试点全部的分数,详见评分方式部分。

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

int buer(int T);
  • T 表示测试点编号。
  • 你需要在函数结束时,返回数列 aa 的最大值。

此外,你提交的程序不应试图从或向任何文件或标准控制流读取或写入信息,否则本题以零分计。 你的程序需要引用全部你所需要的头文件与命名空间。

最终测试时,在每个测试点,交互库会恰好调用一次 buer 函数,并将其返回值作为你程序的结果。

下面是一个示例程序,其功能是获取 a1a9a_1 \sim a_9 并返回 max(a1,a2)\max(a_1,a_2)。选手可以在此基础上继续实现本题。

#include <vector>
using std::max;
using std::vector;
// 引用所需头文件与命名空间中的函数
int ask(int k);
int cheat(); 
// 声明 ask 与 cheat 函数
int buer(int T) {
	vector <int> vec;
	for(int i = 1; i <= 9; i++) {
		int p = ask(1);
		vec.push_back(p);
	}
	return max(vec[0], vec[1]);
}

保证在 ask 函数调用不超过 33333333 次的情况下,最终测试的交互库运行所需时间不超过 0.20.2 秒,交互库本身所消耗的内存不超过 1010 MiB。

测试程序方式

本题目录下提供了交互库的参考实现 grader.cpp。最终测试时所使用的交互库实现与该实现有所不同,因此选手的解法不应依赖交互库的具体实现

选手实现程序 buer.cpp 后,将 grader.cppbuer.cpp 放置在同一目录下,使用如下命令编译得到可执行程序:

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

其中第一行命令会编译 grader.cpp 得到目标文件 grader.o,第二行命令会编译 buer.cpp 得到目标文件 buer.o,第三行命令会将 grader.obuer.o 链接起来,生成可执行文件 buer

按上述方法编译得到的可执行文件 buer,其运行方式如下:

  • 可执行文件将从 buer.in 读入以下格式的数据:

    • 第一行为两个正整数 N,TN,T,分别表示 aa 的长度与测试点编号。
    • 第二行为 NN 个正整数 a0,a1,,aN1a_0,a_1,\ldots,a_{N-1},表示数列 aa
  • 若你的程序正常运行完毕,可执行文件将向 buer.out 写入以下内容:

    • 输出一行两个整数,分别表示你的询问次数与 buer 函数的返回值。

选手在调试时需要保证输入可执行文件 buer 的数据满足上述格式,否则不保证交互库正确运行。

输入格式

你提交的程序不应试图从或向任何文件或标准控制流读取或写入信息。

输出格式

你提交的程序不应试图从或向任何文件或标准控制流读取或写入信息。

4 0
1 2 3 2
3

提示

样例解释 1

本题提供的样例输入中,第一行为两个整数 N,TN,T,分别表示 NN 与测试点编号,样例测试点编号均为 00。第二行为 NN 个整数 a0,a1,,aN1a_0,a_1,\cdots,a_{N-1},表示数列 aa。样例输出为一行一个正整数,表示数列 aa 的最大值。

请注意,你的程序不应试图从或向任何文件或标准控制流读取或写入信息。

评分方式

最终评测收取 buer.cpp,请不要提交选手目录下其他文件。

本题首先会受到和传统题相同的限制,例如编译错误会导致整道题目得 00 分,运行 时错误、超过时间限制、超过空间限制等会导致相应测试点得 00 分等。

在上述条件以外,在一个测试点中,若程序执行了非法的函数调用或 buer 函数返回了错误答案,该测试点将会获得 00 分。否则,假设你的程序调用了 QQask 函数:

  • 0Q3330 \le Q \le 333,且没有调用 cheat 函数,该测试点得 55 分。

  • 333<Q3333333<Q\le 3333,且没有调用 cheat 函数,该测试点得 33 分。

  • 0Q3330\le Q \le 333,但调用了 cheat 函数,该测试点得 22 分。

  • 333<Q3333333<Q\le 3333,但调用了 cheat 函数,该测试点得 11 分。

  • Q>3333Q>3333,该测试点得 00 分。

子任务

对于所有测试数据,保证 2N1062 \le N \le 10^61ai1091 \le a_i \le 10^9

测试点编号 NN\le
11 333333
2202\sim 20 10610^6