POJ 2796 : Feel Good - 区间运算最值

来源:互联网 发布:淘宝买家秀福利的店铺 编辑:程序博客网 时间:2024/06/08 17:12
(寒假马拉松第一场 G题)
题意:
本题主要就是要求一个数列里面,连续的几个数的和乘以这个连续段里最小的一个数,在所有这样连续数列里最大的一个
分析:
我是简单模拟着做的,直接输出最大值就可以了。
网上很多都说,用单调栈 / 单调队列,要去学习学习!
2796Accepted2612K797MSG++849B2014-02-10 17:07:51

#include<iostream>#include<cstdio>#include<cstring>#define LL long longusing namespace std;const int N=100005;int begin[N],end[N],num[N];LL sum[N];int main(){int i,n,b,e;LL ans=-1,t;memset(sum,0,sizeof sum);scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&num[i]);sum[i]=sum[i-1]+num[i];begin[i]=i;end[i]=i;}//for(i=1;i<=n;i++) printf("%d ",num[i]);//puts("");//for(i=1;i<=n;i++) printf("%d ",sum[i]);//puts("");for(i=2;i<=n;i++)while(begin[i]>1 && num[begin[i]-1]>=num[i])begin[i]=begin[begin[i]-1];for(i=n-1;i>0;i--)while(end[i]<n && num[end[i]+1]>=num[i])end[i]=end[end[i]+1];for(i=1;i<=n;i++){t=(sum[end[i]]-sum[begin[i]-1])*num[i];if(t>ans){ans=(LL)t;b=begin[i];e=end[i];}}printf("%lld\n%d %d\n",ans,b,e);return 0;}


0 0