这是一道标准的单调栈的题目,但是由于题目的个例性,该题对于前后两数等于的情况并无额外处理,so也确实是让这题简单了一点
也没什么好说的直接上代码吧
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int N=500005; int n; long long top,ans; long long a[N],s[N]; long long ma(long long a,long long b){return a>b?a:b;}//手写max要快一点 int main(){ while(1){ ans=0; scanf("%d",&n); if(n==0)return 0;//停止条件 for(int i=1;i<=n;i++){ int k; scanf("%lld",&k); while(top>0&&a[top]>=k){//维护单调性 ans=ma(ans,a[top]*(i-s[top-1]-1)); top--; } a[++top]=k;//入栈 s[top]=i; //for(int j=1;j<=top;j++){//手动调试作用。。(本人太弱不会用guide的自带调试。。) // printf("%d %d ",a[j],s[j]); //} //printf("%d ",ans); } while(top>0){//由于读完数据之后并未全部处理完,故再次处理 ans=ma(a[top]*(n-s[top-1]),ans); top--; } printf("%lld ",ans);//输出答案 } return 0; }
啦啦啦就这样