来到了我们的栈专题了,新学到了一个叫单调栈的东西,原理非常简单,但是确实在某些问题的思路上非常的巧妙,比如说这一题
总结一下:该题目用了单调栈的原理
单调栈:顾名思义也就是单调递减或者单调递增的栈,你可以用数组,淡然也可以用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;
}