luogu P4069 [SDOI2016]遊戲
阿新 • • 發佈:2021-07-14
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的放入,那麼直接找到左邊的值了。