单调栈
//伪代码
stack<int> st;
for (遍历数组)
{
if (栈空 || 栈顶元素>=当前元素)
{
入栈;
}
else
{
while (栈非空 && 栈顶元素<当前元素)
{
栈顶元素出栈;
更新结果;
}
当前元素入栈;
}
}
Stack<int> S;
for(int i=1 ;i<=n ;i++){
while(S.size() && a[S.top()] >= a[i]) S.pop();
if(S.empty()) L[i] = 0;
else L[i] = S.top();
S.push(i);
}
主要借鉴:
总结一
HDU 1506
#include<cstdio>
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
typedef long long ll;
ll h[100010];
int l[100010];
int r[100010];
stack<int>s;
ll max(ll a, ll b)
{
if (a > b)return a;
else return b;
}
int main()
{
int n;
while (cin >> n && n)
{
memset(h, 0, sizeof(h));
memset(l, 0, sizeof(l));
memset(r, 0, sizeof(r));
for (int i = 0; i < n; i++)
{
cin >> h[i];
}
while (s.size())s.pop();
for (int i = 0; i <n ; i++)
{
while (s.size() && h[s.top()] >= h[i])s.pop();
if (s.empty())l[i] =0;
else l[i] = s.top()+1;//数组从0开始,push(i),下一对应坐边界应为i+1;
s.push(i);
}
while (s.size())s.pop();
for (int i = n-1; i >=0; i--)
{
while (s.size() && h[s.top()] >= h[i])s.pop();
if (s.empty())r[i] = n;
else r[i] = s.top();
s.push(i);
}
ll ans = 0;
for (int i = 0; i < n; i++)
{
ans = max(ans, h[i] * (r[i] - l[i]));
}
cout<<ans<<'\n';
}
return 0;
}