
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,如果不加的话会产生什么后果呢?就是会更新不到后面的情况,我们刚刚做的都是当前这个数左侧的情况,这个数右侧的情况会忽略。
发布日期:2021-05-08 15:18:22
浏览次数:10
分类:精选文章
本文共 901 字,大约阅读时间需要 3 分钟。

#includeusing 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
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年03月25日 18时30分37秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
js 闭包(新)
2019-03-06
vscode 编辑python 如何格式化
2019-03-06
seo 回忆录百度基本概念(一)
2019-03-06
重新整理数据结构与算法(c#)—— 算法套路二分法[二十四]
2019-03-06
用ThreadLocal来优化下代码吧
2019-03-06
netcore中使用session
2019-03-06
Android 开发学习进程0.25 自定义控件
2019-03-06
多媒体文件格式全解说(下)--图片
2019-03-06
淘宝WAP版小BUG分析
2019-03-06
NodeJS+Express+MongoDB
2019-03-06
(四十四)c#Winform自定义控件-水波-HZHControls
2019-03-06
c#winform主题实现的一个方法
2019-03-06
asp.net打印网页后自动关闭网页【无需插件】
2019-03-06
一个人开发的html整站源码分享网站就这么上线了
2019-03-06
SQLServer 查看耗时较多的SQL语句(转)
2019-03-06
【计算机网络】应用层
2019-03-06
【Maven】POM基本概念
2019-03-06
【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?
2019-03-06
【设计模式】单例模式
2019-03-06