单调队列优化&&P1886 滑动窗口题解
单调队列:
顾名思义,就是队列中元素是单调的(单增或者单减)。
在某些问题中能够优化复杂度。
在dp问题中,有一个专题动态规划的单调队列优化,以后会更新(现在还是太菜了不会)。
在你看到类似于滑动定长度区间的类似问题时可以考虑单调队列优化。
就像这道题:P1886 滑动窗口。
一道模板题。那么我们从题目入手讲解。
首先,你看完了题。。(??)
1.暴力
朴素的入门级想法就是双重for循环枚举当前区间里的每一个元素并取min和max。
因为外层for枚举区间头,内层for枚举区间内位置,所以复杂度O(外层区间长度*内层区间长度)也就是O(nk)。这题是1e6的数据啊。。T飞了。。
2.st表
学过较为高级的数据结构的同学可能会想到线段树和st表。
其中,线段树可以O(nlogn)查询,O(nlogn)修改。st表只支持查询,但是可以O(nlogn)预处理,在这个题中,没有修改的操作,所以我们可以使用st表,相对于线段树更优。
但是计算一下,实际复杂度在两千万?。。可能过,但是我没敢试。。。qwq。一般上千万的复杂度都得看脸过了。。
所以还有更稳定的算法:
3.单调队列
复杂度O(n),为线性算法。
主角来啦!
我们定义一个双端队列q,它两端都可以任意缩短增加长度,我们尝试维护它的长度为k。
当这个窗口向右移动一格时,自然的,要进队一个元素,出队一个元素。
我们尝试保证出队的那个元素为当前区间的最大(举例子)值,那么为了维护队列的单调性,我们必须使得队头的元素要比后面的元素都大。
考虑这样一个oi俗语:有些人比你小,他还比你强,那么你就可以退役了(深有同感)!
对于当前要进队的啊a[i],如果你设一个j,保证a[j]在队中切a[j]比a[i]先入队(head<j<=tail),如果a[j]比当前a[i]小(比你强大),它还先进队(比你小),是不是就抹杀掉了a[j]当最大值的机会?
那么a[j]以及那些像a[j]一类的元素(人)都可以被弹出队列(集体退役)了。。
为什么写着写着莫名辛酸。。去世吧
这也是一个重要的基础,你一定要想懂这个道理!
于是他转化成了这样一句代码:
弹出队尾。
那么,每次只要输出队头(班里的rk1)就可以了。
代码如下:
#include<cstdio>
using namespace std;
int read()
{
char ch=getchar(),last=' ';
int ans=;
while(ch>''||ch<'')last=ch,ch=getchar();
while(ch>=''&&ch<='')ans=(ans<<)+(ans<<)+ch-'',ch=getchar();
return last=='-'?-ans:ans;
} int n,a[],k,q[]; inline int minnn()//求最小值
{
int hea=,tai=;
for(int i=;i<=n;i++)
{
while(hea<=tai&&q[hea]+k<=i)hea++;
while(hea<=tai&&a[i]<a[q[tai]])tai--;//又小又强
q[++tai]=i;
if(i>=k)printf("%d ",a[q[hea]]);//输出rk1
}
printf("\n");
} inline int maxnn()//求最大值
{
int hea=,tai=;
for(int i=;i<=n;i++)
{
while(hea<=tai&&q[hea]+k<=i)hea++;
while(hea<=tai&&a[i]>a[q[tai]])tai--;//又小又强
q[++tai]=i;
if(i>=k)printf("%d ",a[q[hea]]);//输出rk1
}
printf("\n");
} int main(){
n=read(),k=read();
for(int i=;i<=n;i++)
{
a[i]=read();
}
minnn();
maxnn();
return ;
}
一篇辛酸的讲解。
完结。
希望自己不要退役
单调队列优化&&P1886 滑动窗口题解的更多相关文章
- 【单调队列】P1886 滑动窗口
GET 单调队列 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: Th ...
- 洛谷 P1886 滑动窗口 题解
每日一题 day26 打卡 Analysis 单调队列模板 对于每一个区间,有以下操作: 1.维护队首(就是如果你已经是当前的m个之前那你就可以被删了,head++) 2.在队尾插入(每插入一个就要从 ...
- P1886 滑动窗口(单调队列)
P1886 滑动窗口 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: ...
- 【NOIP2017】跳房子 题解(单调队列优化线性DP)
前言:把鸽了1个月的博客补上 ----------------- 题目链接 题目大意:机器人的灵敏性为$d$.每次可以花费$g$个金币来改造机器人,那么机器人向右跳的范围为$[min(d-g,1),m ...
- 单调队列以及单调队列优化DP
单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...
- BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP
BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...
- 洛谷 P3957 跳房子 —— 二分答案+单调队列优化DP
题目:https://www.luogu.org/problemnew/show/P3957 先二分一个 g,然后判断: 由于转移的范围是一个区间,也就是滑动窗口,所以单调队列优化: 可以先令队尾为 ...
- P1886 滑动窗口&&P1440 求m区间内的最小值
声明:下面这两个题就不要暴力了,学一学单调队列吧 推荐博文:https://www.cnblogs.com/tham/p/8038828.html 单调队列入门题 P1440 求m区间内的最小值 题目 ...
- 【单调队列优化】[CF372C] Watching Fireworks is Fun
突然发现我可能单调队列都打不来了...我太菜了... 这道题显然有$$f[i][j]=min\{f[i-1][k]+\vert j-a[i] \vert\}$$ 则$ans=\sum_{i=1}^{m ...
随机推荐
- css 移动端1px更细
1.最近写项目经常遇到4个入口菜单放在一行,然后加border:1px 在移动端显示却很粗,如下图: <div class="header"> <div clas ...
- idea连接docker实现一键部署
一.修改配置文件,打开2375端口 [root@microservice ~]# vim /usr/lib/systemd/system/docker.service 在ExecStart=/usr/ ...
- cmake升级到3.10以上
使用yun install cmake3 安装 ,不会覆盖centos7 cmake 1 添加cmake3 源 echo '[group_kdesig-cmake3_EPEL]name=Copr re ...
- 【转帖】 解开龙芯与mips4000的关系
-- 苏联给的套件,我们只要把电子管插上就好. -- 千万次机器,不晓得来源 DJS-130系列,16位小型机,仿造美国NOVA DJS-180系列,超级小型机,仿造美国DEC VAX, 能跑DEC的 ...
- MySQL优化——索引
内容来自:https://yq.aliyun.com/articles/214494?utm_content=m_31338 对此我们来详细分析下(也就是大家在面试时需要说的): 场景一,数据表规模不 ...
- 利用PLSQL Developer对oracle中的数据进行备份恢复
--以备份scott用户为例,目标(备份里面所有的对象)--切换到scottconn scott/tiger;--进入 工具-->导出用户对象 如图所示 创建表空间及用户名,并赋予权限 -- ...
- 使用Spring-boot-admin对Spring boot的服务进行监控
要进行监控,需要两个Project,一个是Admin Server端,负责监控Spring boot的项目,另一个是Admin Client端,是被监控的Spring boot服务. Admin Se ...
- SQLSERVER2008 内存占用高的处理方式
原文:SQLSERVER2008 内存占用高的处理方式 方法一: 方法二: 使用以下语句查找出什么语句占内存最高,针对占内存高的语句进行优化SELECT SS.SUM_EXECUTION_COUNT, ...
- Spring 如何解决循环依赖问题?
在关于Spring的面试中,我们经常会被问到一个问题,就是Spring是如何解决循环依赖的问题的. 这个问题算是关于Spring的一个高频面试题,因为如果不刻意研读,相信即使读过源码,面试者也不一定能 ...
- Zero Array---思维题
链接 submit B. Zero Array time limit per test 1 second memory limit per test 256 megabytes inpu ...