单调栈

    科技2022-07-21  102

    #include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; int h[100010]; int st1[100010],r1,p1[100010],m1[100010]; int st2[100010],r2,p2[100010],m2[100010]; int main() { //freopen("1.txt","r",stdin); int n; while(cin>>n&&n) { for(int i=1;i<=n;++i) scanf("%d",&h[i]); r1=r2=0; for(int i=1;i<=n;++i) { while(r1>=1&&st1[r1]>=h[i])//h[i]前面第一个小于h[i]的值 r1--; m1[i]=p1[r1]; r1++; st1[r1]=h[i]; p1[r1]=i; } for(int i=n;i>=1;--i) { while(r2>=1&&st2[r2]>=h[i])//h[i]后面第一个小于h[i]的值 r2--; if(r2==0) m2[i]=n+1; else m2[i]=p2[r2]; r2++; st2[r2]=h[i]; p2[r2]=i; } ll ans=0; for(int i=1;i<=n;++i) { ans=max(ans,(ll)h[i]*(m2[i]-1-(m1[i]+1)+1)); } printf("%lld\n",ans); } return 0; }

     

    Processed: 0.012, SQL: 8