【POJ 2823】【Luogu P1886】Sliding Window 滑动窗口
POJ 2823
Luogu P1886
【解题思路】
这是一个单调队列算法的经典题目,几乎学习单调队列的人都接触过这题。
利用单调队列算法求出每一个固定区间内的最(大/小)值。
以下以最大值为例:
将要进队的值如果比队尾大,那么意味着进队值比队尾的值更优,那么 从尾部继续向前寻找,如果还是比前面的更优,那么就一直寻找。直到符合条件或者队列为空为止,接着进行进队操作。
如果队头已经不在区间内,那么队头出队。
对于本题来说,其实队头出队的操作不一定需要写while循环,其实使用if也是等价的。
while (i-b[head]+1>k && head<tail) head++;
if (b[tail]-b[head]+1>k) head++;
在这一题,这样的两句其实是等价的。
【解题反思】
1. 由于数据量非常非常大,一定要采用scanf和printf进行输入输出,否则可能超时。(使用的是POJ的数据)
2. 注意在寻找最值之前要把队列初始化。
【参考程序】
#include<iostream>
#include<cstdio>
using namespace std;
int n,k,a[1000005],b[1000001];
int main()
{
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
for (int j=1;j<=n;j++) b[j]=1000004;//初始化,使之指向一个无穷大的数值
a[1000004]=2147483647;//初始化
int head=1,tail=1,i=1;
while (i<=n)
{
while (a[i]<=a[b[tail]]&&tail>=head)
tail--;
//如果进队的值比当前队尾更优,那么队尾出队
tail++;
b[tail]=i;//进队
if (b[tail]-b[head]+1>k)
head++;//由于每一次进队只进一个
if (i>=k)
printf("%d ",a[b[head]]);//如果已经读入足够的数据,那么输出结果
i++;
}
cout<<endl;
head=1,tail=1,i=1;
for (int j=1;j<=n;j++) b[j]=0;
while (i<=n)//与上同理
{
while (a[i]>=a[b[tail]]&&tail>=head) tail--;
tail++;
b[tail]=i;
if (b[tail]-b[head]+1>k) head++;
if (i>=k) printf("%d ",a[b[head]]);
i++;
}
return 0;
}
如果程序有什么不妥的话,欢迎指出。
萌新第一次写博客,找道水题试试水先23333
【POJ 2823】【Luogu P1886】Sliding Window 滑动窗口的更多相关文章
- [POJ2823]Sliding Window 滑动窗口(单调队列)
题意 刚学单调队列的时候做过 现在重新做一次 一个很经典的题目 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗 ...
- POJ 2823 UESTCoj 1221 Sliding Window 单调队列 经典入门题
题意:给出一个序列,求出每连续k个数字中最大的数和最小的数. 这是道单调队列裸题,直接写就行了. 本来用deque写出来后,发现在poj上硬是超时了,在discuss上看很多人也在抱怨超时的问题,据说 ...
- Spark-Streaming之window滑动窗口应用
Spark-Streaming之window滑动窗口应用,Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作.每次掉落在窗口内的RDD的数据,会被 ...
- 57、Spark Streaming: window滑动窗口以及热点搜索词滑动统计案例
一.window滑动窗口 1.概述 Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作.每次掉落在窗口内的RDD的数据, 会被聚合起来执行计算操作 ...
- POJ 3320 Jessica's Reading Problem (滑动窗口)
题意:给定一个序列,求一个最短区间,使得这个区间包含所有的种类数. 析:最近刚做了几个滑动窗口的题,这个很明显也是,肯定不能暴力啊,时间承受不了啊,所以 我们使用滑动窗口来解决,要算出所有的种数,我用 ...
- POJ 2823 Sliding Window & Luogu P1886 滑动窗口
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 66613 Accepted: 18914 ...
- 洛谷P1886 滑动窗口(POJ.2823 Sliding Window)(区间最值)
To 洛谷.1886 滑动窗口 To POJ.2823 Sliding Window 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每 ...
- POJ - 2823 Sliding Window (滑动窗口入门)
An array of size n ≤ 10 6 is given to you. There is a sliding window of size kwhich is moving from t ...
- POJ 2823 Sliding Window (滑动窗口的最值问题 )
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 41264 Accepted: 12229 ...
随机推荐
- C语言文件输入/输出 ACM改进版(用freopen函数方便检验)
这次用到的文件打开函数不再是fopen,而是stdio.h中包含的另一个函数freopen FILE * freopen ( const char * filename,const char * mo ...
- Java基础(三十)泛型程序(Generic Programming)
一.泛型程序的定义和使用 1.为什么要使用泛型程序设计 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用.同时,使得程序具有更好的可读性和安全性. ArrayList<String&g ...
- 卷积神经网络详细讲解 及 Tensorflow实现
[附上个人git完整代码地址:https://github.com/Liuyubao/Tensorflow-CNN] [如有疑问,更进一步交流请留言或联系微信:523331232] Reference ...
- C函数库stdio.h概况
库变量 size_t 这是无符号整数类型,它是 sizeof 关键字的结果. FILE 这是一个适合存储文件流信息的对象类型. fpos_t 这是一个适合存储文件中任何位置的对象类 ...
- Pandas文本数据处理
先初始化数据 import pandas as pd import numpy as np index = pd.Index(data=["Tom", "Bob" ...
- Redis持久化--Redis宕机或者出现意外删库导致数据丢失--解决方案
echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! Red ...
- vue实现tab选项卡切换效果
tab选项卡切换效果: 通过点击事件传入参数,然后通过v-show来进行切换显示 <template> <div class="box"> <div ...
- 第5天,python之路
已经过了两三天了,东西一点没来写,今天慢慢的写吧. 还是会按Alex Li的流程来学习,编写 写出自己的东西 常用的数据类型 简单的有,str ,int , 常用的: 列表list[], 字 ...
- dhcpv6+radvd服务器搭建
1.isc-dhcp-server install sudo apt update sudo apt-get install isc-dhcp-server 2.设置dhcp 创建/etc/dhcp/ ...
- FileStream相关知识分享
一.如何理解FIleStream 通过前3章的学些,相信大家对于Stream已经有一定的了解,但是又如何去理解FileStream呢?请看下图: 我们磁盘中的任何文件都是通过二进制数组组成,最为直观的 ...