算法竞赛进阶指南pdf_干货|《算法竞赛进阶指南》 0x11 ~ 0x12 代码 + 杂谈

本文详细探讨了算法竞赛中栈和队列的应用,包括单调栈在解决火车进出栈问题和进出站序列问题中的策略,以及队列在蚯蚓问题中的巧妙运用。还提到了单调队列在最大字段和问题中的重要性。
摘要由CSDN通过智能技术生成

作者:德莉傻天下第一可爱

链接:https://blog.nowcoder.net/n/bd5694a397064c7fb6a7160f40d56171

来源:牛客网

0x11 栈

  1. 单调栈 栈的基本操作
class MinStack 
{
    
	public:
	/** initialize your data structure here. */
	int a[5050];
	int mi[5050];
	int tops;
	MinStack() 
	{
    
		tops=0;
	}
	void push(int x) 
	{
    
		a[++tops]=x;
		if(tops==1) 
		{
    
			mi[tops]=x;
		} else 
		{
    
			mi[tops]=min(mi[tops-1],x);
		}
	}
	void pop() 
	{
    
		tops--;
	}
	int top() 
	{
    
		return a[tops];
	}
	int getMin() 
	{
    
		return mi[tops];
	}
}
;

  1. 编辑器 对顶栈 栈的应用 f数组存最大sum
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5 ;
const double pi = acos(-1.0);
int n, m;
int A[maxn], Atop;
int B[maxn], Btop;
int sum[maxn], f[maxn];
signed main() 
{
    
	cin >> n;
	string cmd;
	f[0]=-0x3f3f3f3f;
	while(n--) 
	{
    
		cin >> cmd;
		if(cmd[0] == 'I') 
		{
    
			cin >> m;
			A[++Atop] = m;
			sum[Atop] = sum[Atop - 1] + A[Atop];
			f[Atop] = max(sum[Atop], f[Atop - 1]);
		} else if(cmd[0] == 'Q') 
		{
    
			cin >> m;
			cout << f[m] << endl;
		} else if(cmd[0] == 'D') 
		{
    
			if(Atop)
			 Atop--;
		} else if(cmd[0] == 'R') 
		{
    
			if(Btop == 0)
			 continue;
			A[++Atop] = B[Btop--];
			sum[Atop] = sum[Atop - 1] + A[Atop];
			f[Atop] = max(f[Atop - 1], sum[Atop]);
		} else if(cmd[0] == 'L') 
		{
    
			if(Atop == 0)
			 continue;
			B[++Btop] = A[Atop--];
		}
	}
	return 0;
}

  1. 火车进出栈问题 当入栈 + 出栈火车
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值