單調棧的性質及應用

2021-07-16 22:47:09 字數 1076 閱讀 3797

zzuli  ***

題意:給你一串串行,要你求所有子串行的最小值之和。(n很大,無法暴力)

思路:完美的單調棧模板

這裡簡要介紹下單調棧的性質,(其他的都沒用)

單調棧的維護是 o(n) 級的時間複雜度,因為所有元素只會進入棧一次,並且出棧後再也不會進棧了。

單調棧的性質:

1.單調棧裡的元素具有單調性

2.元素加入棧前,會在棧頂端把破壞棧單調性的元素都刪除

3.使用單調棧可以找到元素向左遍歷第乙個比他小的元素,也可以找到元素向左遍歷第乙個比他大的元素。

(也就是說在元素進棧前他向左拓展的區間已經確定,在出棧前她能向右拓展的區間也能確定)

**如下:

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

#define inf 1000000000

#define mod 1000000007

#define maxn 286000

#define pi 3.1415926

#define lowbit(x) (x&-x)

#define eps 1e-9

struct node

str[maxn];

stackt;

int main()

for (i = 1;i <= n;i++)

t.push(str[i]);

} while (t.empty() == 0)

for (i = 1;i <= n;i++)

sum += str[i].x*(i - str[i].l + 1)*(str[i].r - i + 1);

printf("%lld\n", sum);

}}



單調棧理解及應用

單調棧 棧內元素,按照 單調遞增或單調遞減 排序,如果新入棧元素破壞了單調性,就彈出棧內元素,直到滿足單調性。作用 o n 時間複雜度分別求左右兩邊第乙個比它大或比它小的元素。單調遞增棧為例 維護 每次入棧前先檢驗棧頂元素和進棧元素的大小,判斷棧內元素是否出棧 棧內元素大於等於入棧元素則棧內元素出棧...

單調棧的基本性質介紹

單調棧的定義 單調棧就是棧內元素單調遞增或者單調遞減的棧,單調棧只能在棧頂操作。為了更好的理解單調棧,則可將單調棧用生活情形模擬實現,例如 我們借用拿號排隊的場景來說明下。現在有很多人在排隊買可樂,每個人手裡都拿著號,越靠前的人手裡的號越小,但是號不一定是連續的。小明拿了號後並沒有去排隊,而是跑去約...

單調棧的應用

問題描述 柱狀圖是有一些寬度相等的長方形下端對齊後橫向排列得到的圖形。現在有n個由寬度為1,高度分別為h1,h2,hn的長方形從左到右依次排列組成的柱狀圖。問裡面包含的長方形的最大面積是多少?分析 最容易想到的方法是 討論左端l和右端r。如果確定了長方形的左端l和右端r,那麼最大的可能高度就是min...