推荐题目:洛谷 P3641 [APIO2016] 最大差分
题目背景
评测方式
以下是本题评测方式,与题面不符时以这里为准。
你的代码中不应该包含 gap.h 库。
你的代码中需如下进行 findGap 和 MinMax 函数的声明:
extern "C" void MinMax(long long,long long,long long*,long long*);
extern "C" long long findGap(int,int);
不保证没锅,要是有锅请私信供题人然后 D 死他。
题目描述
有 N N N 个严格递增的非负整数 a 1 , a 2 , … , a N a_1, a_2, \dots, a_N a1,a2,…,aN( 0 ≤ a 1 < a 2 < ⋯ < a N ≤ 10 18 0 \leq a_1 < a_2 < \cdots < a_N \leq 10^{18} 0≤a1<a2<⋯<aN≤1018)。你需要找出 a i + 1 − a i a_{i + 1} - a_i ai+1−ai( 1 ≤ i ≤ N − 1 1 \leq i \leq N - 1 1≤i≤N−1)里的最大的值。
你的程序不能直接读入这个整数序列,但是你可以通过给定的函数来查询该序列的信息。关于查询函数的细节,请根据你所使用的语言,参考下面的实现细节部分。
你需要实现一个函数,该函数返回 a i + 1 − a i a_{i + 1} - a_i ai+1−ai( 1 ≤ i ≤ N − 1 1 \leq i \leq N - 1 1≤i≤N−1)中的最大值。
实现细节
本题只支持 C++(包括 cpp11,cpp14,cpp17)。
C/C++
你需要包含头文件 gap.h。
你需要实现一个函数 findGap(T, N),该函数接受下面的参数,并返回一个 long long 类型的整数:
- T T T:子任务的编号( 1 1 1 或者 2 2 2)
- N N N:序列的长度
你的函数 findGap 可以调用系统提供的查询函数 MinMax(s, t, &mn, &mx),该函数的前两个参数
s
s
s 和
t
t
t 是 long long 类型的整数,后两个参数 &mn 和 &mx 是 long long 类型的整数的指针(mn 和 mx 是 long long 类型的整数)。当 MinMax(s, t, &mn, &mx) 返回时,变量 mn 将会存储满足
a
i
∈
[
s
,
t
]
a_i \in [s, t]
ai∈[s,t] 中
a
i
a_i
ai 的最小值,变量 mx 将会存储满足
a
i
∈
[
s
,
t
]
a_i \in [s, t]
ai∈[s,t],
a
i
a_i
ai 的最大值。如果区间
[
s
,
t
]
[s, t]
[s,t] 中没有序列中的数,则 mn 和 mx 都将存储
−
1
-1
−1。在查询时需要满足
s
≤
t
s \leq t
s≤t,否则程序将会终止,该测试点计为
0
0
0 分。
Pascal
你需要使用单元 graderhelperlib。
你需要实现一个函数 findGap(T, N),该函数接受下面的参数,并返回一个 Int64 类型的整数:
-
T
T
T:子任务的编号(
1
1
1 或者
2
2
2)(
Integer类型) -
N
N
N:序列的长度(
LongInt类型)
你的函数 findGap 可以调用系统提供的查询函数 MinMax(s, t, mn, mx),该函数的前两个参数
s
s
s 和
t
t
t 是 Int64 类型的整数,后两个参数 mn 和 mx 是传引用方式的 Int64 类型的整数(过程内部对这两个变量的修改会影响到外部的对应变量的值)。当 MinMax(s, t, mn, mx) 执行完毕时,变量 mn 将会存储满足
a
i
∈
[
s
,
t
]
a_i \in [s, t]
ai∈[s,t] 中
a
i
a_i
ai 的最小值,变量 mx 将会存储满足
a
i
∈
[
s
,
t
]
a_i \in [s, t]
ai∈[s,t],
a
i
a_i
ai 的最大值。如果区间
[
s
,
t
]
[s, t]
[s,t] 中没有序列中的数,则 mn 和 mx 都将存储
−
1
-1
−1。在查询时需要满足
s
≤
t
s \leq t
s≤t,否则程序将会终止,该测试点计为
0
0
0 分。
输入格式
样例一
C/C++
考虑 N = 4 , a 1 = 2 , a 2 = 3 , a 3 = 6 , a 4 = 8 N = 4, a_1 = 2, a_2 = 3, a_3 = 6, a_4 = 8 N=4,a1=2,a2=3,a3=6,a4=8。
则答案应该是
3
3
3,可以通过下面的几组对 MinMax 的询问获得:
调用 MinMax(1, 2, &mn, &mx),则 mn 和 mx 皆返回
2
2
2。
调用 MinMax(3, 7, &mn, &mx),则 mn 返回
3
3
3,mx 返回
6
6
6。
调用 MinMax(8, 9, &mn, &mx),则 mn 和 mx 皆返回
8
8
8。
Pascal
考虑 N = 4 , a 1 = 2 , a 2 = 3 , a 3 = 6 , a 4 = 8 N = 4, a_1 = 2, a_2 = 3, a_3 = 6, a_4 = 8 N=4,a1=2,a2=3,a3=6,a4=8。
则答案应该是
3
3
3,可以通过下面的几组对 MinMax 的询问获得:
调用 MinMax(1, 2, mn, mx),则 mn 和 mx 皆返回
2
2
2。
调用 MinMax(3, 7, mn, mx),则 mn 返回
3
3
3,mx 返回
6
6
6。
调用 MinMax(8, 9, mn, mx),则 mn 和 mx 皆返回
8
8
8。
样例评测方式
样例测评系统从标准输入中读入两行。第一行包含两个整数,子任务编号
T
T
T,和序列长度
N
N
N。第二行包含
N
N
N 个严格递增的非负整数。然后该程序会向标准输出中写入两行,第一行为 findGap 的返回值,第二行为花费
M
M
M 的值。
下面的输入描述了上面的样例:
2 4
2 3 6 8
注意实际使用的交互库和 spj 对数据进行了加密。
输出格式
无
说明/提示
限制与约定
对于所有的测试点,有 2 ≤ N ≤ 100000 2 \leq N \leq 100000 2≤N≤100000。
每一个测试点开始测试之前, M M M 都将被初始化为 0 0 0。
子任务 1(
30
30
30 分):每一次调用 MinMax 都将使
M
M
M 加
1
1
1。为了获得所有分数,需要满足对于该子任务下的所有测试点,都有
M
≤
N
+
1
2
M \leq \frac{N + 1}{2}
M≤2N+1。
子任务 2(
70
70
70 分):定义
k
k
k 为调用 MinMax 时,区间
[
s
,
t
]
[s, t]
[s,t] 中的序列中数的数量。每次调用 MinMax,将使
M
M
M 加上
k
+
1
k + 1
k+1。对于每一个测试点,如果
M
≤
3
N
M \leq 3N
M≤3N,你将得到 70 分,否则将得到
60
M
N
+
1
−
1
\dfrac{60}{\sqrt{\frac MN + 1} - 1}
NM+1−160 分。你的该子任务的得分是其下所有测试点中的最低分。

243

被折叠的 条评论
为什么被折叠?



