码迷,mamicode.com
首页 > 其他好文 > 详细

单调队列

时间:2019-08-04 01:31:11      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:出队   维护   namespace   就是   ima   dai   一个   lin   int   

看下面一个例题:
给定一个序列,求所有区间长度为L的区间的最大值和最小值。
n,m<=5000000
这个题有啥做法?
O(nlogn)的线段树
O(nlogn)的带删除优先队列(对顶堆)
还能再快一点吗?
O(n)-O(1)RMQ代替线段树
还能再好写一点吗? O(n)的滑动窗口
在队列中维护一个单调性,换而言之让这个队列始终保持里面的元素拥有单调递增/单调递减的属性。
也就是说,维护这L个元素的最大值/最小值即可。
考虑到每个元素最多被进出队1次,因此这是一个O(n)的算法

//wei daima 
#include<iostream>

using namespace std;
const int N=50000010;
int q[N],l=1,r=1,a[N],mx,mn,inq[N],n,m;
inline void ins(int x)
{
    while(l<r&&q[r-1]<=a[x])  r--;
    q[r]=a[x];inq[r]=x;r++;
}
int getmax(int cur)
{
    for(l<r;l++)if(cur-inq[l]<m) return q[l] ;
}
int main()
{
    return 0;
}

单调队列

标签:出队   维护   namespace   就是   ima   dai   一个   lin   int   

原文地址:https://www.cnblogs.com/tbdemons/p/11296902.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!