每个测试的时间限制:4 秒
内存限制:256 兆字节
题目描述
本题是问题的困难版。两个版本的区别在于,在此版本中 ai≤n。
给定一个由 n 个整数 a1,a2,…,an 组成的数组。
你的任务是找到一个子数组 a[l,r](连续的元素序列 al,al+1,…,ar),使得表达式
med(a[l,r])−min(a[l,r])
的值最大。
其中:
med 是子数组的中位数,即子数组排序后位于 ⌈2k+1⌉ 位置的元素,这里 k 是子数组的长度;
min 是该子数组的最小元素。
例如,考虑数组 a=[1,4,1,5,3,3],并选择子数组 a[2,5]=[4,1,5,3]。排序后为 [1,3,4,5]。
med(a[2,5])=4,因为 ⌈24+1⌉=3,排序后第三个元素是 4;
min(a[2,5])=1,因为最小元素是 1。
在此例中,值 med−min=4−1=3。
输入格式
第一行包含一个整数 t(1≤t≤104)——测试用例的数量。
每个测试用例的第一行包含一个整数 n(1≤n≤2⋅105)——数组的长度。
每个测试用例的第二行包含 n 个整数 a1,a2,…,an(1≤ai≤n)——数组的元素。
保证所有测试用例的 n 之和不超过 2⋅105。
输出格式
对于每个测试用例,输出一个整数——所有子数组的 med−min 的最大可能值。
5
5
3 2 5 3 1
4
4 1 1 3
7
6 1 3 4 6 2 7
4
4 2 3 1
5
1 2 3 4 5
3
3
5
2
2
##注意
在第一个示例中,考虑数组 a=[3,2,5,3,1],你可以选择子数组 a[2,3],即元素 [2,5]。
子数组长度为 2。中位数是排序后位于 ⌈23⌉=2 位置的元素。排序后得到 [2,5],med=5。子数组的最小元素:min=2。因此 med−min=5−2=3,这是最大答案。
在第二个测试中,数组 a=[4,1,1,3],你可以选择子数组 a[1,2],即元素 [4,1]。
子数组长度为 2。中位数是排序后位于第 2 位的元素,排序后 [1,4],med=4。最小元素 min=1。因此 med−min=4−1=3。
可以证明这两个子数组都是最优的,并且能得到表达式 med−min 的最大值。