UVA 1619Feel Good 感觉不错 迭代法 (2005 NE)

来源:互联网 发布:sql server数据类型 编辑:程序博客网 时间:2024/06/06 09:44


题不难,迭代法。


#include<bits/stdc++.h>using namespace std;#define all(x) (x).begin(), (x).end()#define for0(a, n) for (int (a) = 0; (a) < (n); (a)++)#define for1(a, n) for (int (a) = 1; (a) <= (n); (a)++)typedef  long long ll;typedef pair<int, int> pii;const int INF =0x3f3f3f3f;const int maxn= 1000000   ;int a[maxn+10],n;ll ans,sum[maxn+10];int ale,ari;int L[maxn+10],R[maxn+10];void update(ll val,int le,int ri){    if(val>ans)    {        ans=val;        ale=le;        ari=ri;    }}void pre(){  sum[0]=0;  sum[1]=a[1];  L[1]=1;  for(int i=2;i<=n;i++)  {     sum[i]=sum[i-1]+a[i];     int p=i;     while(p-1>=1&&a[p-1]>=a[i] )     {         p=L[p-1];     }     L[i]=p;  }  R[n]=n;  for(int i=n-1;i>=1;i--)  {      int p=i;      while(p+1<=n&&a[p+1]>=a[i])      {          p=R[p+1];      }      R[i]=p;  }}void work(){   for1(i,n)   {       int le=L[i],ri=R[i];       ll t=sum[ri]-sum[le-1];       t*=a[i];       update(t,le,ri);   }}int main(){    int kase=0;    while(~scanf("%d",&n))    {        if(kase++)  putchar('\n');        for1(i,n)        {            scanf("%d",&a[i]);        }        ans=(ll)a[1]*a[1];//当初三个值初始化为-1,-1,-1不知道为何wa        ale=1,ari=1;        pre();        work();        printf("%lld\n%d %d\n",ans,ale,ari);    }   return 0;}


0 0