组长大大辛辛苦苦整理的周任务,当然要好好完成啦。比较喜欢单调栈详解的博客,嘿嘿嘿。
相关博客收藏:单调栈原理及应用 详解 附各种类型的题目练习
个人理解:
单调栈简单来说就是根据栈的特点,保持栈内单调递增或递减。(栈:后进先出(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
*/

#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;
}
