[51nod1102]面积最大的矩形(单调栈||预处理)
2024-08-28 17:14:31
题意:求序列上某区间最小值乘区间长度的最大值。
解题关键:很早就在《挑战程序设计竞赛》中见过了,单调栈模板题,注意弹栈时如何处理后面的元素。
法一:单调栈
#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 ;
}
最新文章
- 怎样在python中获取时间?
- Ionic 小节
- Scala的Actor模式 &; Akka框架
- Windows下zlib库和libPng库的编译和使用
- MySQL5.7 linux二进制安装
- Linq to XML 读取XML 备忘笔记
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(17)-LinQ动态排序
- Alpha版与Beta版
- nginx-http-concat资源文件合并模块
- [python]使用django快速生成自己的博客小站,含详细部署方法
- jquery easyui datagrid改变某行的值
- Day040--HTML&;CSS
- Py 最全的常用正则表达式大全 ZZ
- unity3d中Transform组件变量详解
- 使用mod_deflate模块压缩页面优化传输速度
- windows下安装mingw-w64
- stm32 外设使用的配置步骤
- 第二次作业利用java语言编写计算器进行四则运算
- linux 上安装pstree
- 【剑指offer】字符串转换为数字,C++实现