一,
给定一个区间,求所有区间长度为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()
但是如果已经单调了,挺没有必要的。