單調棧:棧內元素,按照(單調遞增或單調遞減)排序,如果新入棧元素破壞了單調性,就彈出棧內元素,直到滿足單調性。
作用:o(n)時間複雜度分別求左右兩邊第乙個比它大或比它小的元素。
(單調遞增棧為例)
維護:每次入棧前先檢驗棧頂元素和進棧元素的大小,判斷棧內元素是否出棧(棧內元素大於等於入棧元素則棧內元素出棧),直到進棧元素入棧。
發揮作用的原理:
1.進棧元素能入棧的時候,此時棧頂元素一定是第乙個左邊第乙個比進棧元素小的元素。
2.棧內元素出棧的時候,此時進棧元素一定是第乙個右邊第乙個比棧頂元素小的元素。
ok!poj 2559
題解: 列舉每個位置高度,對於每個高度(h),找兩邊第乙個比它小的位置(l,r),那麼以當前高度構柱形面積為:(r-l-1)*h
code:
//#pragma comment(linker, "/stack:102400000,102400000")
#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
typedef __int64 ll;
const int n = 100010;
struct nodenode[n];
stacksta;
int main()
if(!sta.empty())
node[i].l = sta.top().id;
sta.push(node[i]);
}ll mx = 0;
for(int i = 1; i <= n; i++)
printf("%lld\n",mx);
}return 0;
}
單調棧的性質及應用
zzuli 題意 給你一串串行,要你求所有子串行的最小值之和。n很大,無法暴力 思路 完美的單調棧模板 這裡簡要介紹下單調棧的性質,其他的都沒用 單調棧的維護是 o n 級的時間複雜度,因為所有元素只會進入棧一次,並且出棧後再也不會進棧了。單調棧的性質 1.單調棧裡的元素具有單調性 2.元素加入棧前...
單調棧的應用
問題描述 柱狀圖是有一些寬度相等的長方形下端對齊後橫向排列得到的圖形。現在有n個由寬度為1,高度分別為h1,h2,hn的長方形從左到右依次排列組成的柱狀圖。問裡面包含的長方形的最大面積是多少?分析 最容易想到的方法是 討論左端l和右端r。如果確定了長方形的左端l和右端r,那麼最大的可能高度就是min...
單調棧的應用
筆者在做leecode的題 求柱形的最大面積 時,接觸到了單調棧這一資料結構,經過研究發現,單調棧是乙個比較簡單的資料結構,但是要靈活運用卻十分不簡單。單調遞增棧 資料出棧的序列為單調遞增序列 單調遞減棧 資料出棧的序列為單調遞減的序列 描述 有n個人站隊,所有的人全部向右看,個子高的可以看到個子低...