萌新刚学单调栈,求助
查看原帖
萌新刚学单调栈,求助
313716
EgLund楼主2021/1/24 08:57

做法假吗?(勿喷)

#include<cstdio>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cctype>
#define ri register int
using std::stack;
using std::min;
using std::max;
int n;
int a[1000009],r[1000009];
stack<int> s;
signed main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	if(n==1)return printf("%d\n",a[1]) & 0;
	if(n==2)return printf("%d\n",max(min(a[1],a[2])*3,min(a[1]*1,a[2]*2))) & 0;
	s=stack<int>();
	for(int i=n;i>=1;i--)
	{
		while(!s.empty()&&a[s.top()]>=a[i]) s.pop();
		r[i]=s.empty()?n+1:s.top();
		s.push(i);
	}
	long long ans=-1919810000LL;
	for(int i=1;i<=n;i++)
	{
		ans=max(ans,(1ll*a[i]*(r[i]-1+i-((r[i]==i+1)?1:0))));
	}
	for(int i=1;i<=n;i++)ans=max(ans,1ll*a[i]*i);
	//for(int i=1;i<=n;i++)printf("%d %lld %lld\n",r[i],(1ll*a[i]*(r[i]-1+i-((r[i]==i+1)?1:0))),1ll*a[i]*i);
    printf("%lld",ans);
}
2021/1/24 08:57
加载中...