POJ2823 滑动窗口 (单调队列)
来学习一下单调队列:
他只可以从队尾入队,但可以从队尾或队首出队,来维护队列的单调性。单调队列有两种单调性:元素的值单调和元素的下标单调。
单调队列可以用来优化DP。状态转移方程形如dp[i]=min{dp[j]+f[j]},i-a<=j<=i-b。i增加1,j的上下界都增加1,即加入一个新的决策到候选集中,要把过时的决策剔除。当决策的取值范围的上下界均单调变化时,每个决策在候选集合中插入或删除最多一次,我们就可以用单调队列来优化。
回到这个题目:
用Min[i]和Max[i]表示以i结尾的大小为k的窗口中的最值。
以Min[i]为例,Min[i]=min{aj} ,i-k+1<=j<=i; i加1,j的上下界同时加1。Min用单调递增的队列维护。
(1)单调递增的队列,队头元素最小;
(2)待入队的元素<=队尾元素,队尾元素出队,直到满足单调性或队列为空,将此元素入队;
(3)队头元素下标<i-k+1,说明过时了,要删去。
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define MAXN 1000010
4 int a[MAXN],Min[MAXN],Max[MAXN],Q[MAXN],n,k;
5
6 void get_min(){//求最小
7 int st=0,ed=0;
8 Q[ed++]=1;
9 Min[1]=a[1];
10 for(int i=2;i<=n;i++){
11 while(st<ed&&a[i]<a[Q[ed-1]]) ed--;//删除队尾元素
12 Q[ed++]=i;//插入队尾元素
13 while(st<ed&&Q[st]<i-k+1) st++;//删除队首过时元素
14 Min[i]=a[Q[st]];//此时答案就是队首元素
15 }
16 }
17
18 void get_max(){//求最大
19 int st=0,ed=0;
20 Q[ed++]=1;
21 Max[1]=a[1];
22 for(int i=2;i<=n;i++){
23 while(st<ed&&a[i]>a[Q[ed-1]]) ed--;
24 Q[ed++]=i;
25 while(st<ed&&Q[st]<i-k+1) st++;
26 Max[i]=a[Q[st]];
27 }
28 }
29
30 int main(){
31 scanf("%d%d",&n,&k);
32 for(int i=1;i<=n;i++) scanf("%d",&a[i]);
33 get_min();get_max();
34 for(int i=k;i<n;i++) cout<<Min[i]<<" "; cout<<Min[n]<<endl;
35 for(int i=k;i<n;i++) cout<<Max[i]<<" "; cout<<Max[n]<<endl;
36 return 0;
37 }
POJ2823 滑动窗口 (单调队列)的更多相关文章
- [POJ2823]Sliding Window 滑动窗口(单调队列)
题意 刚学单调队列的时候做过 现在重新做一次 一个很经典的题目 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗 ...
- POJ 2823 滑动窗口 单调队列
https://vjudge.net/problem/POJ-2823 中文:https://loj.ac/problem/10175 题目 给一个长度为 $N$ 的数组,一个长为 $K$ 的滑动窗体 ...
- luoguP1886 滑动窗口 [单调队列]
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
- [洛谷P1886]滑动窗口 (单调队列)(线段树)
---恢复内容开始--- 这是很好的一道题 题目描述: 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口. 现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的 ...
- [Luogu P1886]滑动窗口--单调队列入门
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
- AcWing 154. 滑动窗口 单调队列
地址 https://www.acwing.com/problem/content/description/156/ 输入格式 输入包含两行. 第一行包含两个整数n和k,分别代表数组长度和滑动窗口的长 ...
- 洛谷 P1886 滑动窗口(单调队列)
题目链接 https://www.luogu.org/problemnew/show/P1886 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始 ...
- cogs 495. 滑动窗口 单调队列
495. 滑动窗口 ★★ 输入文件:window.in 输出文件:window.out 简单对比时间限制:2 s 内存限制:256 MB [问题描述] 给你一个长度为N的数组,一个长为 ...
- POJ 2823 滑动窗口 单调队列模板
我们从最简单的问题开始: 给定一个长度为N的整数数列a(i),i=0,1,...,N-1和窗长度k. 要求: f(i) = max{a(i-k+1),a(i-k+2),..., a(i)},i = 0 ...
- Acwing 154 滑动窗口(单调队列)经典模板
给定一个大小为n≤106n≤106的数组. 有一个大小为k的滑动窗口,它从数组的最左边移动到最右边. 您只能在窗口中看到k个数字. 每次滑动窗口向右移动一个位置. 以下是一个例子: 该数组为[1 3 ...
随机推荐
- js 设置滚动条位置为底部
if (document.getElementById("")) { document.getElementById("").scro ...
- Stream流中的常用方法foeEach和Stream流中的常用方法filter
延迟方法:返回值类型仍然是Stream接口自身类型的方法,因此支持链式调用.(除了中介方法外,其余方法均为延迟方法) 终结方法:返回值类型不再是Stream接口自身类型的方法,因此不再支持类似Stri ...
- java基础———标识符和关键字
标识符以字母开头 (A-Z)或(a-z) 美元符($) 下划线(_) 不能以关键字作为变量名或者方法名 标识符大小写不能混淆 可以中文(不建议) 常用的关键字
- 【JavaWeb】学习路径1-背景
JavaWeb系列也是一个非常庞大的系列,主要分为五个部分讲解: HTML JSP和Servlet CSS的讲解 JavaScrip的讲解 jQuery框架的讲解 学习完上述内容后,就能够基本了解一个 ...
- openstack中Neutron组件简解
一.Neutron概述 Neutron 的设计目标是实现"网络即服务(Networking as a Service)".为了达到这一目标,在设计上遵循了基于 SDN 实现网络虚拟 ...
- KingbaseES 函数稳定性与SQL性能
背景:客户现场的一次艰苦的调优过程(https://www.cnblogs.com/kingbase/p/16015834.html),让我觉得非常有必要让数据库用户了解函数的不同稳定性属性,及其对于 ...
- Mysql 实现 向上递归查找父节点并返回树结构
需求:通过mysql 8.0以下版本实现,一个人多角色id,一个角色对应某个节点menu_id,根节点的父节点存储为NULL, 向上递归查找父节点并返回树结构. 如果只有叶子,剔除掉; 如果只有根,只 ...
- 华南理工大学 Python第6章课后测验-1
1.(单选)以下关于语句 a = [1,2,3,(4,5)]的说法中,正确的个数有( )个.(1)a是元组类型 (2)a是列表类型 (3)a有5个元素 (4)a有4个元素(5)a[2] ...
- Windows 2012 R2上搭建IIS管理用户的隔离模式FTP
Windows 2012 R2上搭建IIS管理用户的隔离模式FTP Windows自带的FTP现在可以提供基于非OS用户的管理,这提高了安全性.即使FTP用户名和密码泄露,也不会对操作系统造成进一步的 ...
- Java中一些必须要知道的东西
直接打印数组名称,得到的是数组对应的内存地址--哈希值.