Problem Description
小C是个云南中医学院的大一新生,在某个星期二,他的高数老师扔给了他一个问题。
让他在1天的时间内给出答案。
但是小C不会这问题,现在他来请教你。
请你帮他解决这个问题。
有n个数,每个数有权值。
数学老师定义了区间价值为区间和乘上区间内的最小值。
现在要你找出有最大区间价值的区间是什么,并输出区间价值。
Input
每个输入文件只包含单组数据。
第一行一个整数n。(1 <= n <= 100000)
第二行n个整数a1,a2,...,an。(0<=ai<=1000000)第二行n个整数a1,a2,...,an。(0<=ai<=1000000)
Output
第一行输出一个整数,表示最大的区间价值。
第二行输出两个整数,表示区间的起点和终点。
保证答案唯一。
sample input
6
10 1 9 4 5 9
sample output
108
3 6
这题一看用线段树是解决不了的,因为如果是满足题意的线段树去获得答案的话,复杂度太高。因此这题需要找到突破点在哪?
突破点就是--区间最小值的位置。
对于每个区间,自身的值为区间和*区间最小值,根据区间最小值的位置pos,可以把区间分成左右两边
总结一下,对于每个区间有 1.当前区间的值,2.pos左边区间的最大值,3.pos右边区间的最大值,三个值取最大值就是当前区间能得到的最大值。
就是看去掉这个最小值之后,看最小值两边的值是否是有大于当前这个区间的值,如果是大于的话就更新
#include
#include
#include
#include
或者这道题目还可以用栈去模拟实现,每一次去入栈的目的就是去找当前栈顶这个元素的能到达的区间范围是多少
什么意思涅~~
拿样例来说:
10 1 9 4 5 9
如果以10为最小值的话,10能覆盖的区间就是[1,1]
如果以1为最小值的话,1能覆盖的区间就是[1,6]
如果以9为最小值的话,9能覆盖的区间就是[3,3]
如果以4为最小值的话,4能覆盖的区间就是[3,6]
………………
依次那么去写出来
然后用栈的目的就是去模拟这个过程
#include
#include
#include
#include