单调栈

来源:互联网 发布:dnf辅助软件 编辑:程序博客网 时间:2024/06/01 10:43
#include<cstdio>//单调栈#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>using namespace std;struct zp{    int v;//该节点的值    int num;//该节点之前(包括自己)大于等于自己的有几个}w[1010];int main(){    int n;    while(~scanf("%d",&n)&&n)    {        int a,head=1,tail=0,ans=0;        for(int i=0;i<n;i++)        {            scanf("%d",&a);            int cont=0;            while(head<=tail&&w[tail-1].v>=a)//栈不为空并且新值小于等于栈顶的元素            {                int tmp=w[tail-1].v*(w[tail-1].num+cont);//计算面积                if(tmp>ans) ans=tmp;//更新ans                cont+=w[tail-1].num;//计算在它之前有多少个之大于等于它                tail--;//栈顶出栈            }            w[tail].v=a;//否则存起来            w[tail++].num=1+cont;//前面大于等于它的有多少个        }        int cont=0;        while(tail>0)//从栈顶到栈尾严格单调递减        {            int tmp=w[tail-1].v*(w[tail-1].num+cont);//同上只不过计算的是右边的            if(tmp>ans) ans=tmp;            cont+=w[tail-1].num;            tail--;        }        printf("%d\n",ans);    }}

0 1
原创粉丝点击