Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
33605 | LYLAKIOIAKIOI | 【S】T1 | C++ | 通过 | 100 | 420 MS | 62764 KB | 1300 | 2024-10-16 12:54:11 |
#include<bits/stdc++.h> #define ull unsigned long long #define PII pair<int,int> #define mk make_pair #define fi first #define se second using namespace std; const int N=2e6+10; const int INF=1e9+10; struct nd{ int id;ull vl,tmp; nd(){} nd(int x,ull y,ull z){ id=x,vl=y,tmp=z; } }; stack<nd> q; int n;ull a[N],v[N]; int lp[N],rp[N]; //int A[N][200]; int main(){ int n;scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%llu",&a[i]); q.push(nd(0,0,0)); for(int i=1;i<=n;i++){ ull val=a[i]; while(!q.empty()){ if(q.top().vl>=a[i]){ val=max(val,q.top().tmp);q.pop(); }else{ lp[i]=q.top().id+1;break; } }q.push(nd(i,a[i],val));v[i]=max(v[i],val); }while(!q.empty()) q.pop(); q.push(nd(n+1,0,0)); for(int i=n;i>=1;i--){ ull val=a[i]; while(!q.empty()){ if(q.top().vl>=a[i]){ val=max(val,q.top().tmp);q.pop(); }else{ rp[i]=q.top().id-1;break; } }q.push(nd(i,a[i],val));v[i]=max(v[i],val); }ull ans=0; for(int i=1;i<=n;i++){ ans=max(ans,v[i]*(rp[i]-lp[i]+1)*a[i]); } printf("%llu",ans); return 0; }