单调序列例题

[亡魂溺海] 提交于 2019-12-16 14:11:58

一,

给定一个区间,求所有区间长度为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()

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!