UVA

来源:互联网 发布:淘宝外卖网址 编辑:程序博客网 时间:2024/06/05 08:05

题目网址点击打开链接

对于某个最小值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;}


原创粉丝点击