题意:给你一段区间,需要你求出(在这段区间之类的最小值*这段区间所有元素之和)的最大值
#include<stdio.h>
#define maxn 100010
struct node
{
int sum,num; //sum为每个元素两边延伸的和,num为该元素的值
}a[maxn];
__int64 MAX(__int64 a,__int64 b){return a>b?a:b;}
int main()
{
int n,top=0,t;
scanf("%d",&n);
__int64 ans=0,pre=0;
while(n--)
{
pre=0; //记录向两边延伸的区间和
scanf("%d",&t);
while(top && a[top].num>=t) //当栈不为空且栈顶元素大于等于入栈元素时
{
ans=MAX((a[top].sum+pre)*a[top].num,ans); //计算最大值
pre+=a[top--].sum; // 记录要入栈元素可向左延伸 和 下一个出栈元素课向右延伸的值 top--为出栈
}
a[++top].num=t; //新元素入栈
a[top].sum=pre+t; // 更新栈顶元素可向左延伸的区间和
}
pre=0;
while(top) //将剩下的元素全部出栈
{
ans=MAX((a[top].sum+pre)*a[top].num,ans);
pre+=a[top--].sum;
}
printf("%I64d\n",ans);
}
/*
输入样例:
6
3 1 6 4 5 2
输出样例:
60
*/