一种先进后出的数据结构。

单调栈

如果新加入的元素毁坏了栈的单调性那就弹出栈顶使得新加入的元素没有毁坏栈的单调性。

例题练习
洛谷 \(P2866\) (单调栈)
洛谷 \(P1241\) (栈)
(简单描述,此篇文章重点在下面)

1、双栈模拟队列

可以用队头栈和队尾栈的方式理解。
比如说样例:

1 5 4 2

加入队列。
元素加入完后

第一个栈:

2 4 5 1

然后将第一个栈内的元素依次丢入第二个栈内得到:

1 5 4 2

这就是所谓的双栈模拟队列
在有一些题目中用双栈比使用队列方便得多。
例题:

\(Q\) \(K\) 翻译有误,下面是正确的。

\(Q\) \(K\):设光标之前的序列为 \(a_1, a_2, \dots, a_n\),令 \(s_i = s_{i - 1} + a_i\), 求 \(s_1, s_2, \dots s_k\) 的最大值

用两个栈存储光标左右的元素,用 \(s_i\) 表示从栈底到第 \(i\) 个元素的和,\(F_i\) 表示从栈底到 \(i\)\(s_i\) 的最大值

用这两个数组和两个栈维护即可。

2、具有查询最小值的栈

现在给定一道原题:

要求只能有栈和一个数组实现,时间复杂度要求 \(O(n)\)

维护一个栈:支持加入新元素,删除栈顶元素,返回栈中的最小值

\(f_i\) 表示从栈底到第 \(i\) 个元素中的最小值,剩下的和普通的栈一样了

3、单调栈的另一种理解方式

单调栈在某种意义上来说是前缀数组的后缀可能最大值。

用样例:

4 3 5 2

来模拟一遍

加入第一个数后,单调栈:

4

加入第二个数后,单调栈:

4 3

加入第三个数后,单调栈:

5

加入第四个数后,单调栈:

5 2

作者语文能力较弱,自行理解。

例题:

\(B3666\)

\(P1950\)

\(ATabc234g\)

posted on 2023-12-07 16:15  appear  阅读(20)  评论(0)    收藏  举报