算法竞赛进阶指南_李煜东_17588649_zhelper-search.pdf
索引:59
0x11 栈
基础应用
两个栈维护前面区间的最小元素
可以开个小根堆维护最小值,但是这样时间是logN的。如果只用一个变量来存,一旦出现了出栈操作就无从下手了。因此用一个线性结构来保存每个历史时刻的最小值。
开两个栈,一个用来存数据,一个记录当前最小值。
有数据入栈,就把这个数据与minn栈栈顶做对比决定是否入栈。出栈也做个对比即可维护这样一个数据结构。
class MinStack {
public:
/** initialize your data structure here. */
stack<int> st;
stack<int> minn;
MinStack() {
}
void push(int x) {
st.push(x);
if(minn.empty()||minn.top()>=x) minn.push(x);
}
void pop() {
if(st.top()==minn.top()) minn.pop();
st.pop();
}
int top() {
return st.top();
}
int getMin() {
return minn.top();
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
序列中修改某个指定位置
始终在序列中间,某个指定位置进行修改,就可以用两个栈,类似于对顶堆用对顶栈来维护。
P2201 数列编辑器 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h>
using ll=long long;
#define int ll
const int N=1e6+10;
const int M=1e5+10;
int q;
int s[N],m[N];
std::stack<int> l,r;
void solve()
{
std::cin>>q;
m[0]=-2e9;
while(q--)
{
char op;
std::cin>>op;
//getchar();
int x;
if(op=='I')
{
std::cin>>x;
l.push(x);
s[l.size()]=s[l.size()-1]+x;
m[l.size()]=std::max(m[l.size()-1],s[l.size()]);
}else if(op=='D'&&l.size()){
l.pop();
}else if(op=='L'&&l.size()){
r.push(l.top());
l.pop();
}else if(op=='R'&&am

文章介绍了如何使用栈数据结构维护序列中的最小元素,包括使用两个栈来处理修改操作,以及在后缀表达式求值中的应用。还涉及到了单调栈和验证栈序列的题目解决方案。
最低0.47元/天 解锁文章
1043

被折叠的 条评论
为什么被折叠?



