单调栈和单调队列都是比较废物的
单调栈的栈具有单调性,可以找到从左或者从右遍历第一个比当前元素小或者比当前元素大的元素的位置
首先给出维护单调栈的代码
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 #include<iostream> 2 #include<stack> 3 using namespace std; 4 const int maxn=100005; 5 int n; 6 int a[maxn]; 7 int l[maxn]; 8 stack<int> s; 9 10 int main() 11 { 12 cin>>n; 13 for(int i=1;i<=n;i++) 14 cin>>a[i]; 15 for(int i=1;i<=n;i++) 16 { 17 while(s.size()&&a[s.top()]>=a[i]) 18 s.pop(); 19 if(s.empty()) 20 l[i]=0; 21 else 22 l[i]=s.top(); 23 s.push(i); 24 } 25 for(int i=1;i<=n;i++) 26 cout<<l[i]<<" "; 27 return 0; 28 }