单调栈

来源:互联网 发布:java中的递归 编辑:程序博客网 时间:2024/04/24 14:31

题意:给你一段区间,需要你求出(在这段区间之类的最小值*这段区间所有元素之和)的最大值


#include<stdio.h>#define maxn 100010struct 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);}/*
输入样例:
63 1 6 4 5 2
输出样例:
60*/         


0 0