什么是单调队列?
单调队列嘛,概念与单调栈相似,就是队列中存放的数据是单调递增或单调递减的,概念很好理解,我们直接从例题对其深入浅出地了解。
1、洛谷P1886 滑动窗口 /【模板】单调队列
题目链接:https://www.luogu.com.cn/problem/P1886
题目大意:求长度为n的序列中每一段长度为k的子序列的最大值和最小值。
题目思路:这种滑动窗口问题是典型的单调队列问题。首先,如果我们暴力解决这个问题,也就是对每个窗口的每一个元素进行扫描的话,时间复杂度为O(n*k),在数据量大的测试点中会TLE,因此我们需要一种数据结构来维护数据。如果我们使用单调队列,会很容易把每次窗口内得到最大值/最小值的时间复杂度降至O(1)。以求最小值为例,具体做法就是创建一个队列,队列中存储的数据是所给序列中元素的下标,这个队列从队头(head)到队尾(tail)是单调递增的(这里的递增指的是下标代表的元素),对于每次遍历,若新元素大于队尾元素,则直接入队,若小于队尾元素,则先把队尾元素踢走再入队,只要队头存储的元素合法,我们就输出以此时队头为下标的元素。求最大值同理。
AC代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+1;
int q1[maxn],q2[maxn],a[maxn];
int n,m;
void solve()
{
int h=1,t=0;
for(int i=1;i<=n;i++)
{
while(h<=t && q1[h]