单调队列
一种下标单调,值也单调的队列。
以长度为 kkk 的区间内最大值为例,在一个数进队时,可以知道在他之前的肯定下标比他小,所以如果前面的数比他小,那么前面的数肯定不能成为最大值,直接出队,如果前面的数比他大,因为前面的数下标靠前,所以这个数有可能在以后成为最大值,将其加入队列,对于不合法的位置,直接出队。
for(int i = 1; i <= n; i ++){
while(head <= tail && a[i] >= a[q[tail]]){
tail --;
}
q[++ tail] = i;
while(head <= tail && q[tail] - q[head] + 1 > m){
head ++;
}
if(i >= m){
cout << a[q[head]] << " ";
}
}
单调栈
一种下标单调,值也单调的栈。
以右边第一个比他大的数为例,对于一个数 xxx,如果 xxx 大于栈顶的值,那么栈顶右边第一个比他大的数即为 xxx,最后将 xxx 压入栈。
因为栈内下标、值都单调,所以如果栈顶没找到,那么栈顶下面的肯定也没找到。
stack <int> stk;
for(int i = 1; i <= n; i ++){
while(!stk.empty() && a[i] > a[stk.top()]){
R[stk.top()] = i;
stk.pop();
}
stk.push(i);
}