单调序列例题

一,

给定一个区间,求所有区间长度为L的区间的最大值和最小值

二,

该题有很多做法。

自然用的是滑动窗口(单调队列)

可能的做法:

O(nlogn)的线段树

O(nlogn)的带删除优先队列(对顶堆)

还能再快一点吗?

O(n)-O(1)RMQ代替线段树

三,

单调队列和单调栈的意思一样,始终要你维持一个单调递增或者递减的属性。

比你小还比你强,我哭了。

1 const int N= 5000010 ;
2 int q[N],l=1,r=1,a[N] , mx , mn, inq[N],n,m; 
inline void ins(int x){ 3 while(l<r&&q [r-1]<=a[x])r--; 4 q[r]=a[x]; inq[r]=x;r++; 5 } 6 inline int getmax(int cur){ 7 for(l<r;l++)if(cur- inq[l] <m)return q[l] ;}

 这个图片我希望能复制进去~

肯定不行啊。。

单调队列

四,

老老实实看来下代码,似乎是改了下 push(),以及把first改成了getmax()

但是如果已经单调了,挺没有必要的。

原文地址:https://www.cnblogs.com/beiyueya/p/12040429.html