1. 程式人生 > 其它 >luogu P4069 [SDOI2016]遊戲

luogu P4069 [SDOI2016]遊戲

1. 使用場景

一個數組,對於第i個元素,找出離它最近且比它大/小的兩邊的index分別是多少?

比如“LeetCode接雨水”這道題,就需要找出距離某個index最近且比它大的兩邊的index,

然後才可以以該index為hight,以right - left + 1位width,求出可以接到的雨水。

再比如“柱狀圖中矩形最大”這道題:

先不看矩形最大,按照動態規劃的原則,需要先找出以該index為height的最大矩形的面積;

和“接雨水”相反,需要找出距離該index最近且小於該index高度的左右兩邊index作為left和right,求出width。

以上就是“一個數組,對於第i個元素,找出離它最近且比它大/小的兩邊的index分別是多少?”,大於小於各舉一例。

2.什麼是單調棧?

一個數組a[5] = {3, 1, 4, 2, 5},存放到一個單調遞增/遞減的棧中,存放的時候記錄一下比該index小/大的元素index,放到一個數組中;

假如新來的元素index打破了棧的遞增/遞減規則,就從棧中移除打破規則的元素。

比如a[5] = {3, 1, 4, 2, 5},找出距離index最近且小於該index的左右元素,需要一個單調遞增棧,步驟:

初始:棧為空,left = -1

3放進去,left[0] = -1,最終棧元素:3

1準備放進去,發現3 > 1,把3拿出來,left = -1;最終棧元素:3

4準備放進去,發現裡面存放的是1,left = 1,最終棧元素:1,4

……

假如準備放進去1,左邊的值3比其大,那麼左邊的值3的放入,不會影響1尋找左邊的值,因為3的放入只會拿出比3大的值!

假如左邊的值比該值小,比如1,4的放入,那麼直接找到左邊的值了。