题意:求序列上某区间最小值乘区间长度的最大值。

解题关键:很早就在《挑战程序设计竞赛》中见过了,单调栈模板题,注意弹栈时如何处理后面的元素。

法一:单调栈

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
stack<int>s;
ll a[];
int main(){
int n;
cin>>n;
for(int i=;i<n;i++) cin>>a[i];a[n]=-;
ll ans=,tmp;
for(int i=;i<=n;i++){
if(s.empty()||a[i]>a[s.top()]) s.push(i);
else if(a[i]<a[s.top()]){
while(!s.empty()&&a[i]<a[s.top()]){
tmp=s.top();
s.pop();
ans=max(ans,1ll*(i-tmp)*a[tmp]);
}
s.push(tmp);
a[tmp]=a[i];
}
}
cout<<ans<<"\n";
return ;
}

法二:预处理,向左向右到达的范围。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[],l[],r[];
int main(){
int n;
cin>>n;
for(int i=;i<=n;i++) cin>>a[i];
for(int i=;i<=n;i++){
int k=i-;
while(a[k]>=a[i]){
k=l[k]-;
}
l[i]=k+;
}
for(int i=n;i>=;i--){
int k=i+;
while(a[k]>=a[i]){
k=r[k]+;
}
r[i]=k-;
}
ll ans=;
for(int i=;i<=n;i++){
ans=max(ans,(r[i]-l[i]+)*a[i]);
}
cout<<ans<<"\n";
return ;
}

最新文章

  1. 怎样在python中获取时间?
  2. Ionic 小节
  3. Scala的Actor模式 &amp; Akka框架
  4. Windows下zlib库和libPng库的编译和使用
  5. MySQL5.7 linux二进制安装
  6. Linq to XML 读取XML 备忘笔记
  7. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(17)-LinQ动态排序
  8. Alpha版与Beta版
  9. nginx-http-concat资源文件合并模块
  10. [python]使用django快速生成自己的博客小站,含详细部署方法
  11. jquery easyui datagrid改变某行的值
  12. Day040--HTML&amp;CSS
  13. Py 最全的常用正则表达式大全 ZZ
  14. unity3d中Transform组件变量详解
  15. 使用mod_deflate模块压缩页面优化传输速度
  16. windows下安装mingw-w64
  17. stm32 外设使用的配置步骤
  18. 第二次作业利用java语言编写计算器进行四则运算
  19. linux 上安装pstree
  20. 【剑指offer】字符串转换为数字,C++实现

热门文章

  1. ASP.NET MVC 相关的社群与讨论区
  2. swift基础教程笔记
  3. Android UI开发第四十三篇——使用Property Animation实现墨迹天气3.0引导界面及动画实现
  4. hive job oom问题
  5. Asp.Net中判断是否登录,及是否有权限?
  6. PHP上传视频
  7. Servlet详解(转)
  8. Unity基本API总览
  9. 【Leetcode-easy】Valid Parentheses
  10. C# HttpRequest