博客
关于我
Codeforces Round #305 (Div. 1) B. Mike and Feet(单调栈)
阅读量:380 次
发布时间:2019-03-05

本文共 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

转载地址:http://yqewz.baihongyu.com/

你可能感兴趣的文章
什么?你竟然还没有用这几个chrome插件?
查看>>
将你的前端应用打包成docker镜像并部署到服务器?仅需一个脚本搞定
查看>>
【俗话说】换个角度理解TCP的三次握手和四次挥手
查看>>
基于Redo Log和Undo Log的MySQL崩溃恢复流程
查看>>
从RocketMQ的Broker源码层面验证一下这两个点
查看>>
如何正确的在项目中接入微信JS-SDK
查看>>
初探WebAssembly
查看>>
关于Objects类的getClass方法为什么可以得到子类的地址的思考
查看>>
239. 滑动窗口最大值
查看>>
纵览全局的框框——智慧搜索
查看>>
手把手教你如何快速构建应用内消息推送与运营能力
查看>>
快服务流量之争:如何在快服务中占领一席之地
查看>>
【活动】直播揭秘<如何从0开发HarmonyOS硬件>
查看>>
Cocos平台集成AGC性能管理(二)—— 性能管理SDK集成
查看>>
华为推送服务 | 简单一招,提高用户活跃和留存
查看>>
基于Cocos SDKHub接入华为HMS Game服务—打包上架流程
查看>>
Unity平台 | 快速集成华为性能管理服务
查看>>
做好付费预测,揭开用户转化的关键秘密
查看>>
华为预测服务新版本上线!自定义预测轻松满足您的个性化需求
查看>>
详细实例教程!集成华为虚假用户检测,防范虚假恶意流量
查看>>