问题 J: 小C的数学问题

题目描述

小C是个云南中医学院的大一新生,在某个星期二,他的高数老师扔给了他一个问题。

让他在1天的时间内给出答案。

但是小C不会这问题,现在他来请教你。

请你帮他解决这个问题。

有n个数,每个数有权值。

数学老师定义了区间价值为区间和乘上区间内的最小值。

现在要你找出有最大区间价值的区间是什么,并输出区间价值。

 

输入

每个输入文件只包含单组数据。
第一行一个整数n。(1 <= n <= 100000)
第二行n个整数a_1,a_2,...,a_n。(0 <= a_i <= 1000000)

 

输出

第一行输出一个整数,表示最大的区间价值。
第二行输出两个整数,表示区间的起点和终点。
保证答案唯一。

 

样例输入

复制样例数据

6
10 1 9 4 5 9

样例输出

108
3 6
#include 
#include 
using namespace std;
const int maxn=1e5+5;
int d[maxn][30];
long long qzh[maxn];
vectorv;
map< pair, int> m;

int n;
long long ans;
int minLoc;
int ansl,ansr;

void rmq_init(const vector &A)
{
    int n=A.size();
    for(int i=0;i(i,0)]=i; }
    for(int j=1;(1<(i,j)]=d[i][j-1](i,j-1)] : m[pair(i+(1<<(j-1)),j-1)];
        }
    }
}
pair rmq(int l,int r)
{
    int k=0;
    while((1<<(k+1))<=(r-l+1)) k++;
    int a=d[l][k](l,k)] : m[pair(r-(1<(min(d[l][k],d[r-(1<ans)) {ans=(qzh[r]-qzh[l-1])*(rmq(l,r).first); ansl=l; ansr=r;}
    else if(l==0&& ((qzh[r])*(rmq(l,r).first)>ans) )  {ans=(qzh[r])*(rmq(l,r).first); ansl=l; ansr=r;}
    if(l>=r) return ;
    minLoc=rmq(l,r).second;
    solve(l,minLoc-1);
    solve(minLoc+1,r);
}

int main()
{

    cin>>n;
    int a;
    for(int i=0;i>a,v.push_back(a);
        if(i==0) qzh[i]=a;
        else qzh[i]=a+qzh[i-1];
    }
    rmq_init(v);
    solve(0,n-1);
    cout<

 

你可能感兴趣的:(递归理解,数据结构,二分)