51nod 1102 【单调栈】
思路:
对于这个高度往左能延伸最远x,往右能延伸最远y,(x+1+y)*w;
利用单调栈就行了;
对于这个高度往左能延伸最远x,往右能延伸最远y,(x+1+y)*w;
利用单调栈就行了;
#include <cstdio> #include <stack> #include <iostream> #include <string.h> #include <algorithm> using namespace std; typedef long long LL; const int N=5e4+10; struct asd{ LL pre; LL next; LL num; }; int n; stack<asd>q; LL ww[N]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%I64d",&ww[i]); asd tmp; tmp.num=ww[1]; tmp.next=tmp.pre=1; q.push(tmp); LL ans=0; for(int i=2;i<=n;i++) { asd tmp1; tmp1.num=ww[i]; tmp1.pre=tmp1.next=1; while(!q.empty()&&tmp1.num<q.top().num) { tmp=q.top(); q.pop(); tmp1.pre+=tmp.pre; if(!q.empty()) q.top().next+=tmp.next; ans=max(tmp.num*(tmp.pre+tmp.next-1),ans); } q.push(tmp1); } while(!q.empty()) { tmp=q.top(); q.pop(); if(!q.empty()) q.top().next+=tmp.next; ans=max(ans,(tmp.next+tmp.pre-1)*tmp.num); } printf("%I64d",ans); return 0; }