CodeForces 548D - Mike and Feet(单调栈)

该博客介绍了如何运用单调栈解决CodeForces上的编程问题548D。题目要求在给定序列中找到任意长度子序列的最小值的最大值。通过单调栈可以在O(n)时间内找出每个元素左侧和右侧第一个小于它的元素,从而计算出对应长度子序列的答案。博客详细解释了算法思路,并讨论了未被计算长度的处理方式。
摘要由CSDN通过智能技术生成

题目链接 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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值