题目背景
由于部分 BUG,使用 C++14 (GCC9) 提交会产生编译错误,请使用 C++14 等语言进行提交。
提交时,无需引用 sequence.h
。你提交的代码中需要实现以下函数:
题目描述
在迷人的 APIO 国,居住一位着年轻智慧的学生 Alice。Alice 对解决能挑战她数学能力的有趣问题有着永不满足的好奇心。一天,她在解决一个神秘的有关长为 N 的序列 (即 A[0],A[1],⋯,A[N−1] ) 的问题时遇到了困难,她无法抗拒探索答案的诱惑力。
现在,她想要与你分享一些她的发现。不过,为了更好的理解,我们需要给出以下定义:
- 定义 W(l,r,x) 为 ∑i=lrI[A[i]=x], 即 x 在 A[l]⋯A[r] 中的出现次数。
- 定义一个非空整数序列 B[0]B[1]⋯B[k−1] 的中位数集合为 S({B[0],B[1]⋯B[k−1]}), 然后 Alice 会展示如何分步计算中位数集合:
○首先,将序列 B[0],B[1],…,B[k−1] 按照升序排序,令排好序的序列为 C[0],C[1],…,C[k−1]0
○ 然后, S({B[0],B[1]⋯B[k−1]})={C[⌊2k−1]],C[⌈2k−1⌉]} 。
○ 为了能更好的理解 S 的计算,以下为一些例子:
- S({6,3,5,4,6,2,3})={4}.
- S({4,2,3,1})={2,3}
- S({5,4,2,4})={4}.
作为一道具有挑战性的问题, Alice 想对于所有的 (l,r)(0≤l≤r≤N−1) 找到其价值 maxx∈S(l,r)W(l,r,x) 的最大值。其中 S(l,r) 代表 A[l]⋯A[r] 导出的中位数集合(正如之前提到的 S(A[l],⋯,A[r]) )。虽然 Alice 已经得到了答案,她需要核对答案的正确性,所以她找到了你,希望你能编程解决问题。
实现细节
你需要实现如下的过程:
- N :序列 A 的长度。
- A : 一个长度为 N 的数组,即输入中提到的序列 A 。
- 该函数应返回一个整数,代表所有可行 (l,r) 价值的最大值。
- 这个函数恰好被调用一次。
输入格式
评测程序示例读取如下格式的输入:
第 1 行: N
第 2 行: A[0]A[1]⋯A[N−1]
输出格式
评测程序示例按照如下的格式打印你的答案:
第 1 行:sequence
的返回值。
提示
例子
样例 1
考虑如下的调用:
函数应返回 3。
在这个样例中, S(0,5)={1,2},W(0,5,1)=3,W(0,5,2)=2 ,所以 (0,5) 的价值为 3 。
容易验证 (0,5) 在所有合法的 (l,r) 二元组中有着最大的价值。
样例 2
考虑如下的调用:
函数应返回 2。
样例 3
考虑如下的调用:
函数应返回 3。
约束条件
- 1≤N≤5×105
- 1≤A[i]≤N
子任务
- (11 分):N≤100 。
- (17 分):N≤2×103 。
- (7 分):存在一个 x 满足 ∀0≤i<x,A[i]≤A[i+1] 且 ∀x<i<N,A[i]≤A[i−1] 。
- (12 分):A[i]≤3 。
- (13 分):W(0,N−1,A[i])≤2 (对于所有满足 0≤i≤N−1 的 i )。
- (22 分):N≤8×104 。
- (18 分):没有额外限制。