题意:
就是固定的区间里面求最大,最小值,区间不断向右移动。

思路:
1.我们考虑暴力的做法枚举每个区间,然后暴力每个区间找最大最小值,这个复杂度是(n-k)*k 最坏的情况接近o(n^2)会超时
2.暴力的时候会发现很多数字进行了重复的比较,并且数字对区间的影响是取决于k的大小,所以我们有没有办法减少数字的比较次数,因为我们所需要最小值和最大值,如果我们找到了最小值,那么这个值和后面的数字相比就好,前面的就不需要比较了。从儿可以减少大量的比较次数,单调队列就刚好可以实现这个想法。

#include<bits/stdc++.h>
#define LL long long 

using namespace std;
const int maxn=1e6+100;

int a[maxn];
int st1[maxn],st2[maxn];
vector<int>ans1,ans2
;
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    int pre=0;
    int top1=0,top2=0;
    int front1=0,front2=0;
    for(int l=1;l<=n;l++)
    {
        while(top1>front1&&a[st1[top1-1]]>a[l])//维护一个最小单调队列
        {
            top1--;
        }
        st1[top1++]=l;
         while(top2>front2&&a[st2[top2-1]]<a[l])//维护一个最大单调队列
        {
            top2--;
        }
        st2[top2++]=l;//存入数组下标
        if(l-pre==k)//区间长度等于k记录答案
        {

            while(pre>=st1[front1])//符合范围内的寻找最小值
            {
                front1++;
            }
            ans1.push_back(a[st1[front1]]);
            while(pre>=st2[front2])
            {
                front2++;
            }
            ans2.push_back(a[st2[front2]]);//符合范围内的寻找最大值
            pre++;
        }
    }
    for(int i=0;i<ans1.size();i++)
    {
        cout<<ans1[i]<<" ";
    }
    cout<<endl;
    for(int i=0;i<ans2.size();i++)
    {
        cout<<ans2[i]<<" ";
    }
    cout<<endl;
    return 0;
}