**
单调栈的基础运用
**
首先看题目。
这是一道经典的模板题目。用来训练我们的单调栈。那么我们为什么会想到以单调栈来解决这道题呢?
我们先画图分析:
可以看到,由于n的范围太大导致一般的结构会超时。
我们的推理从特殊到一般,从中寻找方法途径。
这是理想化模型,那么推广到一般形式呢?
这样我们就找到了使用单调栈的依据。
以上就是基本的算法思考过程和思路,代码实现上需要综合考虑,使得我们的时间控制在O(n)。
这里我的选择是使用数组模拟栈,这是根据本题的特性决定的。
看代码:(头文件自己加)
using namespace std;
long long int a[1000005];
long long int highmi[1000005],w[1000005],maxx[1000005]={0};
int main()
{
long long int x,y,h=0;
while(scanf("%lld",&x))
{
if(x!=0)
{
long long int p;
for(long long int e=1;e<=x;e++)
{
scanf("%lld",&y);
a[e]=y;
}
a[x+1]=0;
p=0;
for(long long int r=1;r<=x+1;r++)
{
if(a[r]>highmi[p])
{
highmi[++p]=a[r];
w[p]=1;
}
else
{
long long width=0;
while(highmi[p]>a[r])
{
width+=w[p];
maxx[h]=max(maxx[h],width*highmi[p]);
p--;
}
highmi[++p]=a[r],w[p]=width+1;
}
}
h++;
}
else break;
}
for(int r=0;r<h;r++)
{
if(r<h-1)
cout<<maxx[r]<<endl;
else cout<<maxx[r];
}
return 0;
}