CF817D Imbalanced Array(单调栈)

CF817D Imbalanced Array

题目传送门

解题思路

AC代码

#include<cstdio>
#include<iostream>
using namespace std;
long long n,s,tail,a[1000005],f[1000005],minl[1000005],minr[1000005],maxl[1000005],maxr[1000005];
int main()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
	f[1]=0;
	tail=1;
	for(int i=1;i<=n;i++)
	 if(a[i]>a[f[tail]])
	 {
	 	minl[i]=i-1;
	 	f[++tail]=i;
	 }
	 else 
	 {
	 	while(a[i]<a[f[tail]]&&tail>=1)tail--;
		minl[i]=f[tail];
		f[++tail]=i;
	 }
	f[1]=n+1; 
	tail=1;
	for(int i=n;i>=1;i--)
	 if(a[i]>a[f[tail]])
	 {
		minr[i]=i+1;
		f[++tail]=i;
	 }
	 else 
	 {
		while(a[i]<=a[f[tail]]&&tail>=1)tail--;
		minr[i]=f[tail];
		f[++tail]=i;
	 }
	a[0]=a[n+1]=2147483647;
	f[1]=0;
	tail=1;
	for(int i=1;i<=n;i++)
	 if(a[i]<a[f[tail]])
	 {
	 	maxl[i]=i-1;
	 	f[++tail]=i;
	 }
	 else
	 {
	 	while(a[i]>a[f[tail]]&&tail>=1)tail--;
		maxl[i]=f[tail];
		f[++tail]=i;
	 }
	f[1]=n+1;
	tail=1;
	for(int i=n;i>=1;i--)
	 if(a[i]<a[f[tail]])
	 {
	 	maxr[i]=i+1;
		f[++tail]=i;
	 }
	 else 
	 {
	 	while(a[i]>=a[f[tail]]&&tail>=1)tail--;
		maxr[i]=f[tail];
		f[++tail]=i;
	 }
	for(int i=1;i<=n;i++)
	 s+=a[i]*1ll*(1ll*(i-maxl[i])*(maxr[i]-i)-1ll*(i-minl[i])*(minr[i]-i));
	cout<<s; 
}

谢谢

猜你喜欢

转载自blog.csdn.net/weixin_45524309/article/details/107959421