【单调队列】P1886 滑动窗口
GET 单调队列
题目描述
现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。
例如:
The array is [1 3 -1 -3 5 3 6 7], and k = 3.

输入输出格式
输入格式:
输入一共有两行,第一行为n,k。
第二行为n个数(<INT_MAX).
输出格式:
输出共两行,第一行为每次窗口滑动的最小值
第二行为每次窗口滑动的最大值
看完我第一感觉是用一种能够删除任意元素的堆,但是这样还要用hash维护每个元素在线性表中的位置。所以——
第一次做时候去学了一个multiset,但是大概因为常数太大,T了三个点(multiset挺好用的,特别是有重复元素的时候。据资料 是用二叉平衡树写的,我觉得它挺像能删除任意元素的堆)
第二次看了看题解,看到了单调队列。花了一些时间仔细看懂,然后觉得单调队列原来也不是很难嘛
单调队列:
这个东西元素值(元素也有可能是一个标号,那么元素值就是标号为下标的值)是单调的。最初我看的时候觉得很奇怪,因为我觉得单调队列里面的元素值应该是完全合法的(即都是符合题意的)。不过这里很巧妙。
比如说我们要维护一个单调递增的单调队列,那么队头应该是最小值、队尾是最大值。我们现在插入一个元素,它只有两种情况:1.小于队尾元素 2.大于等于队尾元素。对于每一个新的元素,由于它的时间戳最新,它们是都要被加进单调队列中的。情况1时,显然队尾元素和新元素相比,既大又老,是肯定不优的(大:和新元素比不能作为最小值;老:比新元素先被排除,无效于之后操作);情况2时,因为新元素最新,即使它暂时没有成为最小的,它也有可能在队尾元素 老掉 之后成为最小的,于是保留在队尾元素之后成为新的队尾。
由此看来,队首与队尾之间的元素暂时没有操作:它们肯定比队首大比队尾小,但是有可能时间戳更老,即无效。所以当它们成为队首元素时,需要对它们进行时间戳 / 有效性的判断。这样在需要用时才进行去除操作,比每次更新时间便更新元素的效率更高。
那么这题只需要维护两个单调队列即可。
【单调队列】P1886 滑动窗口的更多相关文章
- 单调队列优化&&P1886 滑动窗口题解
单调队列: 顾名思义,就是队列中元素是单调的(单增或者单减). 在某些问题中能够优化复杂度. 在dp问题中,有一个专题动态规划的单调队列优化,以后会更新(现在还是太菜了不会). 在你看到类似于滑动定长 ...
- P1886 滑动窗口(单调队列)
P1886 滑动窗口 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: ...
- P1886 滑动窗口&&P1440 求m区间内的最小值
声明:下面这两个题就不要暴力了,学一学单调队列吧 推荐博文:https://www.cnblogs.com/tham/p/8038828.html 单调队列入门题 P1440 求m区间内的最小值 题目 ...
- Luogu P1886 滑动窗口
P1886 滑动窗口 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The a ...
- 洛谷 P1886 滑动窗口(单调队列)
题目链接 https://www.luogu.org/problemnew/show/P1886 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始 ...
- [洛谷P1886]滑动窗口 (单调队列)(线段树)
---恢复内容开始--- 这是很好的一道题 题目描述: 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口. 现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的 ...
- [Luogu P1886]滑动窗口--单调队列入门
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
- luogu P1886 滑动窗口(单调队列
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
- P1886 滑动窗口 /【模板】单调队列 方法记录
原题链接 滑动窗口 /[模板]单调队列 题目描述 有一个长为 \(n\) 的序列 \(a\),以及一个大小为 \(k\) 的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最 ...
随机推荐
- HTML+CSS注意点
1. 对于中文网页,需要在header中使用<meta charset="utf-8">声明编码,否则会出现乱码. 2. 属性 属性 描述 class 为html元素定 ...
- vue教程3-webpack搭建项目
vue-cli https://cli.vuejs.org/zh/ vue-cli是vue的命令行工具,对于创建项目,安装各种组件,运行项目都极为方便,是在开发vue中的必备工具 vue-cli基于n ...
- hadoop分布式存储(1)-hadoop基础概念
hadoop是一种用于海量数据存储.管理.分析的分布式系统.需要hadoop需要储备一定的基础知识:1.掌握一定的linux操作命令 2.会java编程.因此hadoop必须安装在有jdk的linux ...
- 一篇文章彻底了解Java垃圾收集(GC)机制
垃圾收集(Garbage Collection ,GC),是一个长久以来就被思考的问题,当考虑GC的时候,我们必须思考3件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 那么在Java中,我们 ...
- keil-rtx
OS:任务级设计,任务间耦合小:改变裸机前后台设计方案中后台任务轮训无优先级重要任务得不到确定性响应:伪并行,提高利用率. 在keilv4.74最后一个版本之后,KIELV5将KEIL-RTX该为CM ...
- Codeforces Round #377 (Div. 2) E. Sockets
http://codeforces.com/contest/732/problem/E 题目说得很清楚,每个电脑去插一个插座,然后要刚好的,电脑的power和sockets的值相同才行. 如果不同,还 ...
- 使用MRUnit对MapReduce进行单元测试
1. 为什么需要单元测试 一旦MapReduce项目提交到集群之后,若是出现问题是很难定位和修改的,只能通过打印日志的方式进行筛选.又如果数据和项目较大时,修改起来则更加麻烦.所以,在将MapRedu ...
- 《四 spring源码》利用TransactionManager手写spring的aop
事务控制分类 编程式事务控制 自己手动控制事务,就叫做编程式事务控制. Jdbc代码: Conn.setAutoCommite(false); // 设置手动控制事务 Hibern ...
- PHP+Mysql+jQuery找回密码
通常所说的密码找回功能不是真的能把忘记的密码找回,因为我们的密码是加密保存的,一般开发者会在验证用户信息后通过程序生成一个新密码或者生成一个特定的链接并发送邮件到用户邮箱,用户从邮箱链接到网站的重置密 ...
- c#ADSL拨号类
class ADSLHelper { /// <summary> ///拨号 /// </summary> /// <param name="connectio ...