單調棧理解及應用
單調棧:棧內元素,按照(單調遞增或單調遞減)排序,如果新入棧元素破壞了單調性,就彈出棧內元素,直到滿足單調性。
作用:o(n)時間複雜度分別求左右兩邊第一個比它大或比它小的元素。
(單調遞增棧為例)
維護:每次入棧前先檢驗棧頂元素和進棧元素的大小,判斷棧內元素是否出棧(棧內元素大於等於入棧元素則棧內元素出棧),直到進棧元素入棧。
發揮作用的原理:
1.進棧元素能入棧的時候,此時棧頂元素一定是第一個左邊第一個比進棧元素小的元素。
2.棧內元素出棧的時候,此時進棧元素一定是第一個右邊第一個比棧頂元素小的元素。
ok!
poj 2559
題解: 列舉每個位置高度,對於每個高度(h),找兩邊第一個比它小的位置(l,r),那麼以當前高度構柱形面積為:(r-l-1)*h
code:
作用:o(n)時間複雜度分別求左右兩邊第一個比它大或比它小的元素。
(單調遞增棧為例)
維護:每次入棧前先檢驗棧頂元素和進棧元素的大小,判斷棧內元素是否出棧(棧內元素大於等於入棧元素則棧內元素出棧),直到進棧元素入棧。
發揮作用的原理:
1.進棧元素能入棧的時候,此時棧頂元素一定是第一個左邊第一個比進棧元素小的元素。
2.棧內元素出棧的時候,此時進棧元素一定是第一個右邊第一個比棧頂元素小的元素。
ok!
poj 2559
題解: 列舉每個位置高度,對於每個高度(h),找兩邊第一個比它小的位置(l,r),那麼以當前高度構柱形面積為:(r-l-1)*h
code:
//#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef __int64 LL;
const int N = 100010;
struct Node{
int L,R;
int id,val;
}node[N];
stack<Node> sta;
int main()
{
int n;
while(~scanf("%d",&n) && n){
while(sta.size()) sta.pop();
for(int i = 1; i <= n; i++){
node[i].L = 0, node[i].R = n+1;
node[i].id = i;
scanf("%d",&node[i].val);
while(!sta.empty() && sta.top().val > node[i].val){
node[sta.top().id].R = i;
sta.pop();
}
if(!sta.empty())
node[i].L = sta.top().id;
sta.push(node[i]);
}
LL mx = 0;
for(int i = 1; i <= n; i++)
{
LL tmp = (LL)(node[i].R-node[i].L-1)*(LL)node[i].val;
mx = max(mx,tmp);
}
printf("%lld\n",mx);
}
return 0;
}
相關文章
- 單調棧/單調佇列佇列
- 單調棧 和 單調佇列佇列
- 單調棧和單調佇列佇列
- 單調棧模板
- 正規表示式理解及簡單應用舉例
- 淺談單調棧
- 簡單計算器(棧的應用)
- 基於應用理解的協議棧最佳化協議
- 演算法之單調棧演算法
- 單調棧學習小思考
- 說說你對棧、佇列的理解?應用場景?佇列
- 棧的應用
- 特殊資料結構:單調棧資料結構
- [JSOI2008] 最大數 (單調棧)JS
- HISTOGRA - 最大矩形面積(單調棧)
- Lucene介紹及簡單應用
- 【筆記】線段維護單調棧筆記
- LeetCode Monotone Stack Summary 單調棧小結LeetCodeMono
- 單調棧進階-接雨水-最大矩形
- Leetcode:單調棧_可見山峰問題LeetCode
- 深入理解 JavaScript 單例模式及其應用JavaScript單例模式
- 簡單計算器 (關於棧的一種應用)
- I - Max answer 計蒜客 - 38228 單調棧
- Largest Submatrix of All 1’s(思維+單調棧)
- 01 . SaltStack部署配置及簡單應用
- 棧的原理與應用
- 棧的實際應用
- 單機百萬連線調優和Netty應用級別調優Netty
- 深入理解Java ClassLoader及在 JavaAgent 中的應用Java
- 無源互調分析儀PIM Analyzer原理及應用
- Restful 應用理解REST
- Codeforces #123D: 字尾陣列+單調棧3D陣列
- 第十章 單調棧 Part2
- bzoj3190: [JLOI2013]賽車(單調棧)
- Leetcode321. 拼接最大數——單調棧的使用LeetCode
- codeforce 686div3 F Array Partition單調棧
- 資料結構與演算法 | 棧的實現及應用資料結構演算法
- cJSON學習及簡單應用小結JSON
- UDP 協議簡單瞭解及應用UDP協議