uva 1619 单调 求一段序列和 和 其中最小值的乘积的最大值

来源:互联网 发布:淘宝专业模板宝贝装修 编辑:程序博客网 时间:2024/06/03 23:41
#include<cstdio>#include<cstring>#define INF 0x3f3f3f3fusing namespace std;int d[100010],l[100010],r[100010];long long sum[100010];int main(){int n,t=0;while(scanf("%d",&n)==1){memset(sum,0,sizeof(sum));for(int i=1;i<=n;i++){scanf("%d",&d[i]);sum[i]=sum[i-1]+d[i];l[i]=r[i]=i;}d[0]=d[n+1]=-1000000000;for(int i=1;i<=n;i++)while(d[l[i]-1] >= d[i]) l[i]=l[l[i]-1];for(int i=n;i>=1;i--)while(d[r[i]+1] >= d[i]) r[i]=r[r[i]+1];int resl=1,resr=1;long long res=0;for(int i=1;i<=n;i++){long long t=d[i]*(sum[r[i]]-sum[l[i]-1]);if(t>res){res=t;resl=l[i];resr=r[i];}} if(t)printf("\n");t++;printf("%lld\n%d %d\n",res,resl,resr);}}

原创粉丝点击