題意:已經懶得吐槽了。。有N個山峰,(N<=10^5),每個山峰有高度h,對應著每個山峰有一個d值,每個山峰到所有其他的嚴格比
它高的山峰都會經過一個最低值(山谷),d代表是h減去這些最低值中的最大值的差(如果不存在比它高的山峰那麼d就是它本身的
高度),問有多少山峰的d>=150000米。
思路:利用單調棧維護每個峰左邊第一個比它高的峰的位置l,右邊第一個比它高的峰的位置r,對於r,我們從前向後維護一個單調減
序列,如果當前考慮的點i比棧頂的元素高度高,那麼彈出棧頂元素,並將它的r置為i,直到棧頂元素的高度大於等於i的高度。對於l,
從後往前維護單調減序列。對於每個點,求[ l[ i ] , i ] 的最小值d1,[ i , r[ i ] ]的最小值d2,求個最大值d=max(d1,d2),然後看是否h[i]-
d>=150000,是就輸出,可以RMQ預處理一段區間的最小值,詳見代碼:
/*********************************************************
file name: LA6531.cpp
author : kereo
create time: 2015年02月06日 星期五 17時00分19秒
*********************************************************/
#include
#include
#include
#include
#include
#include