51nod 1102 【单调栈】

时间:2023-03-10 06:56:36
51nod 1102 【单调栈】

思路:

对于这个高度往左能延伸最远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;
}