最大数 洛谷

3 篇文章 0 订阅

来到了我们的栈专题了,新学到了一个叫单调栈的东西,原理非常简单,但是确实在某些问题的思路上非常的巧妙,比如说这一题
总结一下:该题目用了单调栈的原理
单调栈:顾名思义也就是单调递减或者单调递增的栈,你可以用数组,淡然也可以用STL里的Stack,都是很方便的,假设是单调递增的栈,如果前面的数字比你大那你就将这个数字出栈就可以了。
该题创建了一个普通数组用以存输入进来的数字,然后开了一个单调栈,用以储存一个单调递减的栈,至于为何是单调递减呢,因为单调递增数列是不符合本题的思想的(可以自己尝试一下),单调递减的话比如我想找后四个数字里最大的对吧,我们假设有7个数字,那我们如果用了递减数列,找序号3,4,5,6就可以了,单调递减数列那么看看三有没有在,依次找下去,总可以找到一个最大的数字的,因为如果三是最大的,那么三之后序号456都不会存储在栈中。

#include<iostream>
#include<algorithm>
#define M 200005
using namespace std;
int m, p, t, x, sz, r, a[M], q[M];
char ch;
int main() {
	scanf("%d%d", &m, &p);
	for (int i = 1; i <= m; i++) {
		scanf("%s%d", &ch, &x);
		if (ch == 'A') {
			a[++sz] = (x + t) % p;
			while (r&&a[q[r - 1]] < a[sz])r--;
			q[r++] = sz;
		}
		else if (ch == 'Q')printf("%d\n", t = a[*lower_bound(q, q + r, sz - x + 1)]);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值