题目网址点击打开链接
;
、
对于某个最小值ai来说,所选的区间应该尽量大,直到再选就不能保证ai是最小值的时候停止。
在扫描过程中维护一个向前延伸的最大位置,扩展的时候注意传递性,如果前面一个元素比它小,那么前面一个元素能延伸到的位置,
当前元素也可以延伸到,然后类似链表往前找的同时延伸链即可。向后找的时候类似。区间和用一个前缀和来处理。
ummmmmm
这个题目有毒,明明说好的,结果一样 l r 输出任意。wa了n次就wa在这里
那 r ,l 不赋初值的话 1 0 这个样例答案是错的,但是在后面temp那判断式加一个= 应该就对了,还是wa
后来赋初值以后加= 还是wa 但是加一个r-l<r[i]-l[i] 之后就会对
什么神奇的数据
#include <iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=100000+5;
int s[maxn];
int l[maxn];
int r[maxn];
long long sum[maxn];
int n;
int main()
{
//freopen("out.txt","w",stdout);
int t=0;
while(cin>>n)
{
s[0]=-1;s[n+1]=-1;//一定要有 否则会wa????
sum[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i]);
sum[i]=sum[i-1]+s[i];
l[i]=i;
r[i]=i;
}
for(int i=1;i<=n;i++)
{
while(s[l[i]-1]>=s[i])//=不能缺
{
l[i]=l[l[i]-1]; //延伸
}
}
for(int i=n;i>=1;i--)
{
while(s[r[i]+1]>=s[i])
{
r[i]=r[r[i]+1];
}
}
int ll=1,rr=1;//ll rr 一定要赋初值1没有就会wa,不懂为啥
long long ans=0;
for(int i=1;i<=n;i++)
{
//cout<<sum[r[i]]-sum[l[i]-1]<<endl;
long long temp=(sum[r[i]]-sum[l[i]-1])*s[i];
if(temp>ans) //????神奇不能有=
{
ans=temp;
ll=l[i];
rr=r[i];
}
}
if(t!=0)
printf("\n");
t++;
printf("%lld\n%d %d\n",ans,ll,rr);
}
return 0;
}