单调队列

单调队列

概念

队列是类似于双端栈的一种数据结构。

单调队列与单调栈相似,是用来维护具有一定单调性的队列,与单调栈不同的是他的左端叶可以进行操作。

例题

  • 求在这个固定长度内的最值。
  • 使用双端队列,比用线段树或者st表更加优秀,例如求最大值,就可以比较右端比他更小的数弹出去因为他更靠右更大,同时再考虑左端元素的下标是否满足是否合法,即是否在属于这个滑动窗口。

板子

void solve()
{
    int n,m;
    cin>>n>>m;
    deque<int> q;
    vector<int> a(n+1);
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++)
    {
        while(!q.empty()&&i-q.front()>=m)q.pop_front();//判断元素是否合法;
        while(!q.empty()&&a[q.back()]<=a[i])q.pop_back();//判断是否有更符合条件选手出现;
        q.push_back(i);
        if(i>=m) cout<<a[q.front()]<<endl;
    }
}
posted on 2023-03-20 16:07  NONEEDDEBUG  阅读(11)  评论(0编辑  收藏  举报