Codeforces Round #305 (Div. 1) B. Mike and Feet(单调栈)

题目链接
在这里插入图片描述
题意:给定一个数组,要你选连续x个数的最大值是多少?(一个数组的最大值定义为这个数组的元素的最小值)。
思路:我们可以用单调栈来维护每个元素的连续区间长度,那么我们先考虑每个数前面的,如果栈内元素是1 2 5 6,现在的元素是4,那么很明显5和6都要被弹出去,那么这个时候包含了5和6这两个元素的区间长度他们的最小值是不是都可以变为4了呀,如果5的连续区间是1,6的连续区间是2,那么长度为1的和长度区间为3的最小值是不是就可以更新为4了?我们就这样依次动态更新,不过再最后的时候我们要多加一个尾元素0,如果不加的话会产生什么后果呢?就是会更新不到后面的情况,我们刚刚做的都是当前这个数左侧的情况,这个数右侧的情况会忽略。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
stack<pair<int,int>>s;//first存下标,second存连续区间长度 
int n,a[maxn],ans[maxn]={0},minn=1e9+1,maxx=0;
int main()
{
	scanf("%d",&n); 
	for(int i=1;i<=n;++i) scanf("%d",&a[i]),minn=min(minn,a[i]),maxx=max(maxx,a[i]);
	a[++n]=0; 
	for(int i=1;i<=n;++i)
	{
		int len=0;
		while(!s.empty()&&a[s.top().first]>=a[i])
		{
			ans[len+s.top().second]=max(ans[len+s.top().second],a[s.top().first]);
			len+=s.top().second;
			s.pop();
		}
		s.push({i,len+1});
	}
	for(int i=n-1;i>=1;--i)
	ans[i]=max(ans[i],ans[i+1]);
	for(int i=1;i<n;++i) printf("%d ",ans[i]);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值