单调对列 good feeling

#include<bits/stdc++.h>//复杂度O(n^2)数据水
using namespace std;
typedef long long LL;
#define max(a,b) ((a)>(b)?(a):(b))
/long long max(long long x,long long y)
{
return x>y?x:y;
}
/
const LL N=1e5+5;
LL data[N],ans;//data求前缀和
deque vis1,vis2;//记录下标
LL a[N];
int main()
{
LL n;
scanf("%lld",&n);
for(LL i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
data[i]=data[i-1]+a[i];
}
for(LL i=1;i<=n;i++)
{
for(LL j=i;j>=1;j–)//往左推
{
while(!vis1.empty()&&a[j]>=a[i])
vis1.pop_back();
vis1.push_back(j);
if(a[i]>a[j]) break;//有小的就退出
}
//得到vis1.front(),最左侧的下标
for(LL j=i;j<=n;j++)//往右推
{
while(!vis2.empty()&&a[j]>=a[i])
vis2.pop_back();
vis2.push_back(j);
if(a[i]>a[j]) break;
}
//得到vis2.front(),最右侧的下标
ans=max(ans,(a[i]*(data[vis2.front()]-data[vis1.front()-1])));
while(!vis1.empty()) vis1.pop_back();
while(!vis2.empty()) vis2.pop_back();
}
printf("%lld\n",ans);
return 0;
}
5
3 1 6 4 5 2
output
60

max=(6+4+5)*4
https://www.luogu.org/problemnew/show/P2422

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值