单调栈
组长大大辛辛苦苦整理的周任务,当然要好好完成啦。比较喜欢单调栈详解的博客,嘿嘿嘿。
相关博客收藏:单调栈原理及应用 详解 附各种类型的题目练习
个人理解:
单调栈简单来说就是根据栈的特点,保持栈内单调递增或递减。(栈:后进先出(LIFO-last in first out):最后插入的元素最先出来。 队列:先进先出(FIFO-first in first out):最先插入的元素最先出来。)
例如:实现一个单调递增的栈,比如现在有一组数10,3,7,4,12。从左到右依次入栈,则如果栈为空或入栈元素值小于栈顶元素值,则入栈;否则,如果入栈则会破坏栈的单调性,则需要把比入栈元素小的元素全部出栈。单调递减的栈反之。
模板题:
简单理解之后,写了一个模板题,下面是通过的代码(大佬帮忙改bug的时候,表示这个板子太复杂了,心塞塞,继续加油啦!!!)
POJ 2559
多组样例,每组 n n个数据 最后一个输入0。结束
1<=n<= 100000
Sample Input
7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0
Sample Output
8
4000
数据规模与约定
时间限制:1s1s
空间限制:64MB
*/
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <stack> #include <string.h> #include <stdio.h> using namespace std; int n,height[100080]={},width[100080]={},top=0; long long ans=0; int main() { stack<int> mystack; while(cin>>n&&n!=0) { for(int i=1;i<=n;i++) scanf("%d",&height[i]); height[n+1]=0; while(!mystack.empty()) { mystack.pop(); } //先清空栈 for(int i=1;i<=n+1;i++) { if(mystack.empty()||mystack.top()<=height[i]) { mystack.push(height[i]); width[++top]=1; } else { int Widthsum=0; while(!mystack.empty()&&mystack.top()>height[i]/*栈非空并且栈顶元素大于等于入栈元素*/) { Widthsum+=width[top]; ans=max(ans,(long long)Widthsum*mystack.top()); mystack.pop(); top--; //栈顶元素出栈; //更新结果; } mystack.push(height[i]); width[++top]=Widthsum+1; } } printf("%lld\n",ans); memset(height,0,sizeof(height)); memset(width,0,sizeof(width)); top=0; ans=0; } return 0; }