关于单调栈:
类似优先队列,栈内元素按递增或递减排列,
实现:(以单调递增为例)
当空栈或栈顶比进栈元素大时,直接进;当比栈顶大时,出栈直到入栈入栈后满足单调递增。
板子:R56953588
#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
#include<string>
#include<cstring>
#include<stack>
using namespace std;
long long m[5000005];
long long ans[5000005];
int main(){
stack<long long> a;
long long n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>m[i];
}
m[n+1]=1e9+100;
for(int i=1;i<=n+1;i++){
if(a.empty()||m[a.top()]>m[i]){
a.push(i);
continue;
}
while(!a.empty()&&m[a.top()]<=m[i]){
ans[a.top()]=i;
if(i==n+1){
ans[a.top() ]=0;
}
a.pop();
}
a.push(i);
}
/*
while(!a.empty() ){
ans[a.top()]=0;
a.pop() ;
}*/
for(int i=1;i<=n;i++){
cout<<ans[i]<<" ";
}
return 0;
}
练习:
CH1803
题目:找最大矩形
#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
#include<string>
#include<cstring>
#include<stack>
using namespace std;
int k,h[2000],l[2000],r[2000],n,m,ans;
int main() {
memset(h,0,sizeof(h));
ans = 0;
cin>>n>>m;
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
char ch;
while(ch=getchar()) {
if(ch=='R' || ch=='F') break;
}
if(ch=='F') {
h[j]++;
}
else{
h[j]=0;
}
}
stack<int> st;
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
for(int i=1; i<=m; i++) {
while(!st.empty() && h[i]<=h[st.top()]){
st.pop();
}
if(!st.empty()){
l[i] = st.top();
}
else{
l[i] = 0;
}
st.push(i);
}
while(!st.empty()) st.pop();
for(int i=m; i>=1; i--) {
while(!st.empty() && h[i]<=h[st.top()]) {
st.pop();
}
if(!st.empty()) {
r[i] = st.top();
}
else{
r[i] = m+1;
}
st.push(i);
}
for(int i=1; i<=m; i++) ans = max(ans , ((r[i]-1)-(l[i]+1)+1) * h[i]);
}
cout<<ans*3;
return 0;
}