Mooo 单调队列求解

来源:互联网 发布:电器用瓷瓶数据 编辑:程序博客网 时间:2024/05/17 08:09

 

题目描述:

有 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的右端了。