關於單調棧

2021-10-21 11:55:15 字數 2685 閱讀 6693

單調棧:單調遞增或單調減的棧,主要通過push和pop兩個操作巧妙的解決一些有關序列的問題。

#include

#include

#include

#include

#define ll long long

using namespace std;

const int mod =

998244353

;const int maxn =

3e6+10;

ll a[maxn]

;ll f[maxn]

;stack s;

int main()

for(int i =

1; i <= n; i++

)else

s.push

(i);}}

for(int i =

1; i <= n; i++

)return0;

}

#include 

.h>

#define ll long long

#define t int t

;scanf

("%d",&

t);while(t

--)using namespace std;

const int mod =

998244353

;const int maxn =

1e6+10;

int a[maxn]

;int last[maxn]

;int vis[maxn]

;vector ans;

int main()

for(int i =

1; i <= n; i++

) vis[a[i]]=

1;//選當前數

ans.

push_back

(a[i]);

}for

(int i =

0; i < ans.

size()

; i++

)return0;

}

再來幾道經典例題

題意有n頭牛,每頭牛可以看到右側比他矮的牛,求每頭牛可看到牛的總數。

思路利用單調棧,碰到一頭牛判斷與棧頂的牛的高度,低於棧頂的牛就把當前牛入棧(下標),否則,邊出棧邊計算下標差值(可看到牛的數量)。

注意最後加一頭1e9的牛便於棧清空和棧牛剩餘牛的可見數量的計算。

#include

#include

#include

#include

#define ll long long

using namespace std;

const int mod =

998244353

;const int maxn =

1e6+10;

ll a[maxn]

;stack s;

int main()

a[n]

=1e9

;//為了最後清空棧

for(ll i =

0; i <= n; i++

)else

s.push

(i);

//把當前牛入棧(下標) 為了計算}}

printf

("%lld\n"

, ans);}

return0;

}

題意:已知n個矩形的高度,寬度都為1,求最大面積。

思路:利用單調棧,每次遇到乙個矩形,判斷與棧頂的關係,若當前高度》棧頂矩形,則入棧,否則,依次把棧裡的矩形出棧,並計算以出棧的矩形為最高高度的大矩形的面積(當前的矩形不進入計算)。

注意:在最後加一塊高度為-1的矩形便於最後棧的清空與棧內矩形計算。

**

#include

#include

#include

#include

#define ll long long

using namespace std;

const int mod =

998244353

;const int maxn =

1e6+10;

ll a[maxn]

;stack s;

int main()

a[n]=-

1;//為了最後清空棧

ans =0;

ll cnt =0;

for(ll i =

0; i <= n; i++

)else

s.push

(top)

;//可延伸到的最左側入棧

a[top]

= a[i]

;//入棧的高度為當前的高度}}

printf

("%lld\n"

, ans);}

return0;

}

關於單調棧

單調棧是個什麼概念呢?其實說白了它就是個棧這是廢話 咳,舉個栗子 因為2比3小,所以直接砍掉 然後2比1大,所以2就待在1上面。也就是說棧裡存著乙個單調序列。那麼單調棧有啥用呢?我們來看個例題 農民john的某 n 頭奶牛 1 n 80,000 正在過亂頭髮節!由於每頭牛都 意識到自己凌亂不堪的髮型...

關於單調佇列的個人理解

一 何為單調佇列?1 首先搞懂,什麼是佇列 佇列是一種資料結構,兩個埠,乙個埠進元素,乙個埠出元素,那麼,根據這種操作的定義,不難發現 佇列具有 先進先出 的性質 2 單調佇列 單調佇列,顧名思義,具有的單調性的佇列,即佇列中的元素按照某種特徵有一定的順序。比如單調遞增的佇列,單調遞減的佇列。3 舉...

單調棧 模板 單調棧模板

biu 單調棧主要用於求取左邊第乙個比它大,或者比它小的數。就比如站隊隨便排成一列,可以求到每個人後面第乙個比他高的人。同理可以推廣至右邊,比它矮均可。這就是單調遞增棧 遞減棧,從前至 棧,從後向前入棧的區別了。單調棧比較抽象,非常具有智慧型的想法,可應用的場景相當少,根據幾個經典題目體會它的用法會...