Codeforces Round #305 (Div. 1) B. Mike and Feet(单调栈)
发布日期:2021-05-08 15:18:22 浏览次数:10 分类:精选文章

本文共 901 字,大约阅读时间需要 3 分钟。

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

#include
using namespace std;typedef long long ll;const int maxn=2e5+5;stack
>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
上一篇:Codeforces Round #401 (Div. 2) E. Hanoi Factory(单调栈+思维)
下一篇:Codeforces Round #200 (Div. 1) D. Water Tree(dfs序+线段树+思维)

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年03月25日 18时30分37秒