#P3641. [APIO2016] 最大差分

[APIO2016] 最大差分

题目背景

评测方式

以下是本题评测方式,与题面不符时以这里为准。

你的代码中不应该包含 gap.h 库。

你的代码中需如下进行 findGapMinMax 函数的声明:

extern "C" void MinMax(long long,long long,long long*,long long*);
extern "C" long long findGap(int,int);

spj 与交互库

不保证没锅,要是有锅请私信供题人然后 D 死他。

题目描述

NN 个严格递增的非负整数 a1,a2,,aNa_1, a_2, \dots, a_N0a1<a2<<aN10180 \leq a_1 < a_2 < \cdots < a_N \leq 10^{18})。你需要找出 ai+1aia_{i + 1} - a_i1iN11 \leq i \leq N - 1)里的最大的值。

你的程序不能直接读入这个整数序列,但是你可以通过给定的函数来查询该序列的信息。关于查询函数的细节,请根据你所使用的语言,参考下面的实现细节部分。

你需要实现一个函数,该函数返回 ai+1aia_{i + 1} - a_i1iN11 \leq i \leq N - 1)中的最大值。

实现细节

本题只支持 C++(包括 cpp11,cpp14,cpp17)

C/C++

你需要包含头文件 gap.h

你需要实现一个函数 findGap(T, N),该函数接受下面的参数,并返回一个 long long 类型的整数:

  • TT:子任务的编号(11 或者 22
  • NN:序列的长度

你的函数 findGap 可以调用系统提供的查询函数 MinMax(s, t, &mn, &mx),该函数的前两个参数 ssttlong long 类型的整数,后两个参数 &mn&mxlong long 类型的整数的指针(mnmxlong long 类型的整数)。当 MinMax(s, t, &mn, &mx) 返回时,变量 mn 将会存储满足 ai[s,t]a_i \in [s, t]aia_i 的最小值,变量 mx 将会存储满足 ai[s,t]a_i \in [s, t]aia_i 的最大值。如果区间 [s,t][s, t] 中没有序列中的数,则 mnmx 都将存储 1-1。在查询时需要满足 sts \leq t,否则程序将会终止,该测试点计为 00 分。

Pascal

你需要使用单元 graderhelperlib

你需要实现一个函数 findGap(T, N),该函数接受下面的参数,并返回一个 Int64 类型的整数:

  • TT:子任务的编号(11 或者 22)(Integer 类型)
  • NN:序列的长度(LongInt 类型)

你的函数 findGap 可以调用系统提供的查询函数 MinMax(s, t, mn, mx),该函数的前两个参数 ssttInt64 类型的整数,后两个参数 mnmx 是传引用方式的 Int64 类型的整数(过程内部对这两个变量的修改会影响到外部的对应变量的值)。当 MinMax(s, t, mn, mx) 执行完毕时,变量 mn 将会存储满足 ai[s,t]a_i \in [s, t]aia_i 的最小值,变量 mx 将会存储满足 ai[s,t]a_i \in [s, t]aia_i 的最大值。如果区间 [s,t][s, t] 中没有序列中的数,则 mnmx 都将存储 1-1。在查询时需要满足 sts \leq t,否则程序将会终止,该测试点计为 00 分。

输入格式

样例一

C/C++

考虑 N=4,a1=2,a2=3,a3=6,a4=8N = 4, a_1 = 2, a_2 = 3, a_3 = 6, a_4 = 8

则答案应该是 33,可以通过下面的几组对 MinMax 的询问获得:

调用 MinMax(1, 2, &mn, &mx),则 mnmx 皆返回 22

调用 MinMax(3, 7, &mn, &mx),则 mn 返回 33mx 返回 66

调用 MinMax(8, 9, &mn, &mx),则 mnmx 皆返回 88

Pascal

考虑 N=4,a1=2,a2=3,a3=6,a4=8N = 4, a_1 = 2, a_2 = 3, a_3 = 6, a_4 = 8

则答案应该是 33,可以通过下面的几组对 MinMax 的询问获得:

调用 MinMax(1, 2, mn, mx),则 mnmx 皆返回 22

调用 MinMax(3, 7, mn, mx),则 mn 返回 33mx 返回 66

调用 MinMax(8, 9, mn, mx),则 mnmx 皆返回 88

样例评测方式

样例测评系统从标准输入中读入两行。第一行包含两个整数,子任务编号 TT,和序列长度 NN。第二行包含 NN 个严格递增的非负整数。然后该程序会向标准输出中写入两行,第一行为 findGap 的返回值,第二行为花费 MM 的值。

下面的输入描述了上面的样例:

2 4
2 3 6 8

注意实际使用的交互库和 spj 对数据进行了加密。

提示

限制与约定

对于所有的测试点,有 2N1000002 \leq N \leq 100000

每一个测试点开始测试之前,MM 都将被初始化为 00

子任务 1(3030 分):每一次调用 MinMax 都将使 MM11。为了获得所有分数,需要满足对于该子任务下的所有测试点,都有 MN+12M \leq \frac{N + 1}{2}

子任务 2(7070 分):定义 kk 为调用 MinMax 时,区间 [s,t][s, t] 中的序列中数的数量。每次调用 MinMax,将使 MM 加上 k+1k + 1。对于每一个测试点,如果 M3NM \leq 3N,你将得到 70 分,否则将得到 60MN+11\dfrac{60}{\sqrt{\frac MN + 1} - 1} 分。你的该子任务的得分是其下所有测试点中的最低分。