单调栈模板
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);
}
应用
1.给定一组数,针对每个数,寻找它和它左边第一个比它小的数之间有多少个数。
2.给定一序列,寻找某一子序列,使得子序列中的最小值乘以子序列的长度最大。
3.给定一序列,寻找某一子序列,使得子序列中的最小值乘以子序列所有元素和最大。
模板题1:题目
#include<iostream>
#include<stack>
using namespace std;
typedef long long ll;
const int maxn=1e5;
ll high[maxn]={0};
ll c[maxn]={0};
int main()
{
ll sum=0;
int n, i;
cin>>n;
for(i=1;i<=n;i++) cin>>high[i];
stack<ll> s;
for(i=n;i>=1;i--){
while(s.size()&&high[s.top()]<high[i]) s.pop();
if(s.empty()) c[i]=n+1;
else c[i]=s.top();
s.push(i);
}
for(int i=1;i<=n;i++) sum+=c[i]-i-1;
cout<<sum<<endl;
return 0;
}