单调队列

单调队列

单调队列用来求某个固定大小的窗口内的最大值或者最小值问题。

输入样例:

8 3 
1 3 -1 -3 5 3 6 7

期望输出:

-1 -3 -3 -3 3 3 
3 3 5 5 6 7

代码实现:

#include<bits/stdc++.h>
using namespace std;

const int N =1e6+9;

int n,k;
int a[N],q[N];

int main()
{
    cin>>n>>k;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    int h=0,l=-1;
    for(int i=0;i<n;i++)
    {
        //判断队头是不是在滑动窗口内
        while(h<=l&&i-k+1> q[h]) h++;
        //
        while(h<=l&&a[q[l]]>=a[i]) l--;

        q[++l]=i;

        //输出
        if(i>=k-1) printf("%d ",a[q[h]]);

    }

    for(int i=0;i<n;i++)
    {
        //判断队头是不是在滑动窗口内
        while(h<=l&&i-k+1> q[h]) h++;
        //
        while(h<=l&&a[q[l]]<a[i]) l--;

        q[++l]=i;

        //输出
        if(i>=k-1) printf("%d ",a[q[h]]);

    }
}

  

posted @ 2025-05-16 02:58  小花护符  阅读(7)  评论(0)    收藏  举报