题目描述:
有 N 个能量发射站排成一行,每个发射站i都有不相同的高度 Hi,并能向两边(当然两端的只能向一边)同时发射能量值为 Vi 的能量,并且发出的能量只被两边最近的且比它高的发射站接收。
显然每个发射站发来的能量有可能被0 或 1 或 2 个其它发射站接收,特别是为了安全,它受到的能量总和是我们很关心的。由于数据很多,请你帮助我们计算出接受了最多能量的发射站接受的能量是多少。
数据范围
1 <= N <= 50,000
1 <= hi <= 2,000,000,000
1 <= vi <= 10,000
输入文件(mooo.in):
第1行: 一个整数 N
第2..N+1行:第 i+1 行有2个整数 Hi Vi,表示第i个发射站的高和发射的能量值。
输出文件(mooo.out):
一行:一个发射站接收到的最大能量值。
输入
3 4 2 3 5 6 10
输出
7
题目就是在数列{an}中,对于每一个a[i],他的左边和右边第一个大于他的位置加上i位置所释放的能量。
如果用朴素的算法,对于a[i],向左和向右分别枚举,最坏情况下是O(n^2)。所以不能拿满分。
现在引入单调队列(至于关于单调队列的具体内容,可以到百科上查一查。)。
单调队列的本质就是维护一个队列,这个队列始终是有序的(升序,降序...)。本题维护的是一个升序队列,每次元素i入队的时候,从尾往前找到第一个大于他的数n,插入在其后面,而原来在其后面的所有元素就丢弃了。所以n是i满足条件的左端。当i被后面的元素m遮挡的时候,m就是i的右端了。