题目链接 https://vjudge.net/problem/CodeForces-548D
【题意】
给定一组长度为n的序列a[1],a[2]…a[n](n<=2e5,a[i]<=1e9),现在对于任意一个区间长度len(1<=len<=n),要求长度为len的连续子序列中最小值的最大值是多少,比如一个序列n=5,序列元素为2,3,6,4,1,那么当长度为2时答案就是4,即子序列{a[3],a[4]}中的最小值
【思路】
单调栈的基础应用,单调栈可以在O(n)的时间内处理出序列中的每一个元素的左边第一个比他大/小的元素及其位置,和第一个右边比他大/小的元素及其位置,当然这道题我们只要处理每个元素的左右两边第一处比它小的位置就行了。比如我们找到了a[i]左边第一处比他小的元素是a[x],右边第一处比他小的位置是a[y],那就说明(x,y)这个开区间里面,a[i]是最小值,说明a[i]的值就是长度=y-x-1(开区间的长度)对应的答案,对每个元素我们都这样计算一次即可得出结果。当然有些长度我们可能计算不到,比如下面的例子
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
a[i] | -inf | 1 | 2 | 3 | 4 | 5 | 5 | 3 | 2 | 1 | 6 | -inf |
le[i] | -1 | 0 | 1 | 2 | 3 | 4 | 4 | 2 | 1 | 0 | 9 | -1 |
ri[i] |