博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P1886 滑动窗口
阅读量:4982 次
发布时间:2019-06-12

本文共 1723 字,大约阅读时间需要 5 分钟。

以最大值为例,既然我们想要保证队列开头为答案,那么我们就要保证每次更新使最大值一直放在队列。那么如果存储的最大值该弹出了怎么办呢?我们只需要记录下每个元素的位置,判断是否在区间内即可。

队头弹出后,第二位就变成了队头,我们就要保证这个数现在是区间内最大。那么是不是说,我们需要将这个长度为 $ k $ 的区间中的每一个数都存起来呢?不是的,并不是每个数被记录都有意义的。举个例子, $ a_i $ 和 $ a_j $ 两个数, $ i<j $ 。如果 $a_i >a_j $,那么两个数都应该记录;但是如果 $ a_i≤a_j $ ,那么当 $ a_j $ 进入区间后, $ a_i $ 的记录就没有意义了。很好理解,我们假设每个数作为区间最大值的次数为它的贡献,当 $ a_j $ 进入区间以后,在区间中存在的时间一定比 $ a_i $ 长,也就说明 $ a_i $ 一定不会再做贡献了,我们确定没有贡献的点,便可以直接删去,以维护单调队列的单调性。

#include 
#include
#include
#include
#include
#define re registerusing namespace std ;const int maxn = 1e6 + 5 ;inline int read () { int f = 1 , x = 0 ; char ch = getchar () ; while ( ch > '9' || ch < '0' ) {if(ch == '-') f = -1 ; ch = getchar () ; } while ( ch >= '0' && ch <= '9' ) {x = (x << 1) + (x << 3) + ch - '0' ; ch = getchar () ; } return x * f ;}int n , k , a[maxn] ;int head = 1 , tail ;struct Node { int val , pos ;}q[maxn] ;int main () { n = read () ; k = read () ; for(re int i = 1 ; i <= n ; ++ i) {a[i] = read () ;} for(re int i = 1 ; i <= n ; ++ i) { while(head <= tail && q[head].pos + k <= i) ++head ; while(head <= tail && q[tail].val >= a[i]) --tail ; q[++tail].val = a[i] ; q[tail].pos = i ; if(i >= k) printf("%d " , q[head].val) ; } head = 1 , tail = 0 ; printf("\n") ; for(re int i = 1 ; i <= n ; ++ i) { while(head <= tail && q[head].pos + k <= i) ++head ; while(head <= tail && q[tail].val <= a[i]) --tail ; q[++tail].val = a[i] ; q[tail].pos = i ; if(i >= k) printf("%d " , q[head].val) ; } return 0 ;}

转载于:https://www.cnblogs.com/Stephen-F/p/10414883.html

你可能感兴趣的文章
设置定点数学属性
查看>>
自动化测试工具 Test Studio入门教程
查看>>
排序算法(一) —— 冒泡排序
查看>>
No.026:Remove Duplicates from Sorted Array
查看>>
SpringBoot项目的几种创建方式,启动、和访问
查看>>
解决"disabled". Expected Boolean, got Number with value 0
查看>>
Android 四大组件之Service
查看>>
OC--init,initialize,initWithCoder:,initWithFrame:各方法的区别和加载顺序
查看>>
xml.dom.minidom
查看>>
Exponentiation
查看>>
本地jar上传到本地仓库
查看>>
四则运算C++带Qt界面版本,吾王镇楼。。。。。
查看>>
各种获取时间的方法包含各类时间格式
查看>>
安卓7.0手机拍照闪退问题解决
查看>>
黑马程序员------IO(一)
查看>>
springcloud的配置
查看>>
ME525+ Defy+ 刷机指南[zz]
查看>>
支持触屏的jQuery轮播图插件
查看>>
差一点搞混了Transactional注解
查看>>
javascript基本函数
查看>>