單調隊列::poj2823 Sliding Window

单调队列与滑动窗口(Sliding window, poj2823) 单调队列,顾名思义,就是(严格)单调(递增或递减)的队列。下面以单调递减队列为例。 单调递减队列: 1.单调递减的队列,队首元素总是最大的。 2.元素只能从队尾入队,但可以从队尾或队首出队。若待入队的元素>=队尾元素,队尾元素出队,直到待入队的元素=窗口宽度,说明队首元素已不在窗内,队首元素出队。 3.单调队列有两个单调性:(1)元素的值是严格单调的,这里是严格单调递减;(2) 阅读详情

 题目:

一个长度为 N 的数组,一个长为 K 的滑动窗体从最左移至最右端, 你只能见到窗口的K个数,每次窗体向右移动一位,如下表: 要找出窗口在各位置时的 max value,min value

Window position                 Min value  Max value 
[ 1  3  -1 ]  -3  5  3  6  7    -1         3 
1  [ 3  -1  -3 ]  5  3  6  7    -3         3 
1  3  [ -1  -3  5 ]  3  6  7    -3         5 
1  3  -1  [ -3  5  3 ]  6  7    -3         5 
1  3  -1  -3  [ 5  3  6 ]  7    3          6 
1  3  -1  -3  5  [ 3  6  7 ]    3          7 

一开始我想用和3250一样的DP来做,但发现那是行不通的,没有最优子结构。尝试用单调队列:维护一个单调队列,若队列为空,则入队;首先找到队头;然后若新元素比队尾元素小则入队,若比队尾元素大,则队尾不断出队,然后新元素入队;判断此时队长是否大于等于k,若是则输出队头。

自己寫的單調隊列代码在VS上试了很多次都是可以的,但在poj上老是AC不了,没办法,先忍着。

下面是用STL的模板 priority_queue 來做的,簡潔明瞭,耗時差不多,但由於vector占用的內存較大,所以18836k有點蔚為壯觀。

 

#include "stdafx.h"
#include<iostream>    //18836K 5844MS 
#include<queue>
int MIN(int a,int b) { return a<b?a:b; }
int MAX(int a,int b) { return a>b?a:b; }
#define CLR(NAME,VALUE) memset(NAME,VALUE,sizeof(NAME))
using namespace std;
const int N=1000011;
int d[N],imin[N],imax[N];

struct Cmp1{bool operator()(const int a1,const int a2){return d[a1]>d[a2];}};
struct Cmp2{bool operator()(const int a1,const int a2){return d[a1]<d[a2];}};
priority_queue<int,vector<int>,Cmp1> q1;  //最小堆
priority_queue<int,vector<int>,Cmp2> q2;  //最大堆

int _tmain(int argc, _TCHAR* argv[])
{
	int i,n,k;
	scanf("%d%d",&n,&k);
	if( k>n )  k=n;
	for(i=0;i<n;++i) scanf("%d",d+i);   //輸入整個數組
	for(i=0;i<k;++i){q1.push(i);q2.push(i);}  //初始化堆
	int len(0);       //長度初始化
	imin[len]=d[q1.top()];   //前k個數的最小值
	imax[len++]=d[q2.top()]; //前k個數的最大值
	for(i=k;i<n;++i){
		q1.push(i);
		q2.push(i);
		while( i-q1.top()>=k )  q1.pop();
		while( i-q2.top()>=k )  q2.pop();
		imin[len]=d[q1.top()];
		imax[len++]=d[q2.top()];
	}
	for(i=0;i<len;++i)
		printf("%d%c",imin[i],i==len-1?'\n':' ');
	for(i=0;i<len;++i)
		printf("%d%c",imax[i],i==len-1?'\n':' ');
    
     return 0;
}



 

[POJ2823]Sliding Window(单调队列)by_zgx 博客链接 http://blog.youkuaiyun.com/CABI_ZGX/article/details/52701138 立即下载

相关推荐

task5:在本地搭建大模型(ollama 和 LM studio 对比),接入 openclaw

关于大模型,大家千万不要想着在本地部署,根本不可行,没有那个财力。另外大模型迭代快,不可能每周都在下载大模型。再次,还是国外的模型好用,国内的模型真的在 deepresearch 上就有很大问题,你们懂的。所以本篇文章,还是聚焦在探索层面+实操,并不会实战。

这里是 AI 食用指南,持续分享有用的AI 实操和应用! 1968

POJ 2823 Sliding Window 单调队列+优先队列

Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 69712   Accepted: 19787 Case Time Limit: 5000MS Description An array of size n ≤ 106 is given to you. T...

紫芝的博客 429

使用基于物质点法(MPM)的Anura3D模拟沙柱坍塌

本博客使用开源软件Anura3D软件模拟了一个沙柱坍塌的过程,这个软件是基于基于物质点法(MPM)设计的

weixin_59902634的博客 4043

Sliding Window POJ - 2823

Sliding Window POJ - 2823 An array of sizen≤ 106is given to you. There is a sliding window of sizekwhich is moving from the very left of the array to the very right. You can only see theknu...

Willen_的博客 297

避坑指南:C#用S7NetPlus读写西门子PLC字符串(String/WString)的完整方案

本文详细解析了C#通过S7NetPlus读写西门子PLC字符串(String/WString)的完整方案,包括内存布局、编码差异和字节序处理等关键技术细节。提供了实战优化的代码示例和常见问题排查指南,帮助开发者避免乱码、截断等常见陷阱,提升工业自动化项目的开发效率。

weixin_32956805的博客 320

信创改造实战:SpringBoot项目迁移到宝兰德BES 9.5.5的完整避坑指南(附依赖配置)

本文详细介绍了将SpringBoot项目迁移到宝兰德BES 9.5.5中间件的完整流程,包括环境准备、依赖调整、Web.xml版本适配、部署配置优化及常见问题解决方案。特别针对信创改造需求,提供了排除Tomcat依赖、处理BES专用starter等实用技巧,帮助开发者顺利完成国产中间件迁移。

weixin_30825581的博客 1098

【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 the very left of the array to the very right. You can only see the k numbers in the window. Each...

哇哈哈哈的博客 253

FastApi教程

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web )服务器与本地浏览器之间传输超文本的传送协议。HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。

小石潭记丶 1562

sliding window poj

  这个题主要用的还是单调队列,大体思路如下: 1.创建两个<deque>型队列q1,q2; 2.将每个窗口里的最小数用q1求出,最大数用q2求出,并且将其存入两个数组中; 3.输出两个数组。 注: 单调队列:比如严格单调不增的队列,队列为空或新增元素小于队尾元素时,将其放入队尾;否则一直将队尾元素出队,再将新增元素入队;当队首元素不符合要求(不在窗口中)时也...

weixin_30242907的博客 146

【Bluetooth|蓝牙开发】二、蓝牙开发入门

蓝牙,是一种利用低功率无线电,支持设备短距离通信的无线电技术,能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换,蓝牙工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段,使用IEEE802.11协议。

Donge's Blog 1万+

OpenClaw人人养虾:接入即时通讯平台Zalo

通过 Zalo Official Account(OA,官方账号)API,可以将 OpenClaw 接入 Zalo,实现面向越南用户的自动化客服和互动。

王国平的博客 437

[单调队列] poj 2823 Sliding Window

题意: 给你n个数和一个k 把n分成连续的n-k+1个区间 第一行按顺序输出每个区间的最小值,第二行是最大值。 思路: 单调队列的模板题,这里注意的是插入队尾的时候需要二分加速 代码: #include"stdio.h" #include"algorithm" #include"string.h" #include"iostream" #include"queue" #include

Enmity_Dark 709

uniapp [安卓苹果App端] - 详细实现PDF预览功能在线预览PDF文档,Uniapp App端实现pdf文件预览在线预览pdf二进制文件流、本地pdf文档、PDF文件地址url路径(解决白屏

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,uniapp在线预览pdf功能,在安卓苹果app平台实现PDF的预览查看,uniappApp端实现pdf文件预览,UNIAPP在线预览PDF文档,Uniappapp在线预览pdf文件流,从后端接口里获取pdf文件如何转成链接预览,预览pdf的插件,uni-app的pdf预览功能,uniapp使用pdf.js插件预览pdf文件,预览pdf白屏没有报错,打开后没反应,打开是空白,加载PDF时发生错误,如

🏆 前端领域优质创作者 1万+

POJ 2823 Sliding Window(单调队列)

题意  长度为n的数组上有个长度为k的滑窗从左向右移动  求每次移动后滑窗区间的最小值和最大值  输出两行  第一行所有最小值  第二行所有最大值 可以用线段树来做  但是单调队列更简单  单调递增队列: 队尾单调入队(入队元素大于队尾元素时直接入队  否则队尾出队直到队尾元素小于入队元素或者队列为空)  队首队尾都可以出队 求最小值时 先判断队首元素是否在滑窗之内  不在队首就出队  然后

Deng's site \# 2787

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

POJ2823 Sliding Window 单调队列

题目链接 http://poj.org/problem?id=2823 分析 单调队列模板,在从队尾出队时,可以用二分快速找到最终位置,但效果并不明显。 AC代码 #include <cstdio> inline int read() { int num = 0, flag = 1; char c = getchar(); while (c < '0' || c >...

Kevin的博客 255

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

poj2823 Sliding Window(单调队列)

题意: 给定一个长度为 NNN 的数字序列,要求你求出每个长度为 KKK 的区间内的最小值与最大值。 单调队列做法: const int N = 1e6 + 10; const int mod = 998244353; int a[N], maxx[N], minn[N], queue1[N], queue2[N];//queue存位置 int i, n, k, front1, front2, tail1, tail2, cnt; int main() { sdd(n, k); cn..

邵光亮的博客 14万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

POJ 2823 Sliding Window 单调队列

解题思路: 维护一个递增的单调队列和一个递减的单调队列,基础题。 代码: #include #include #include #include #include #include #include #include #include #include #include #define LL long long #define FOR(i,x,y) for(int i=

蘑菇--走在通往梦想的道路上。 852

POJ - 2823 Sliding Window(单调队列)

题目链接:https://vjudge.net/problem/POJ-2823 题意:给定一个数列,从左至右输出每个长度为k的数列段内的最小数和最大数。 思路:单调队列维护两端,它的头端可以出数,尾部可以进数,通常用于解决局部性的最值问题。单调栈只维护一端,通常维护全局的单调性。单调栈大小没有上限,而单调队列通常有大小限制。所以本题选择用单调队列解。 代码中数组的解释: 数组用来表示一个单调队列 数组表示单调队列里每个元素在原数组中的下标 本题只需维护两个队列(单调递减队列,头部肯定是最大值,.

sugarbliss 441

ACM-单调队列之Sliding Window——poj2823

ACM 单调队列 Sliding Window poj2823 单调队列详解

继续激情,继续奋斗。 2507

[POJ2823]Sliding Window(单调队列)

[POJ2823]Sliding Window(单调队列)-ZGX

私は Mocha!! 692

单调队列 Sliding Window POJ - 2823

单调队列在求滑动窗口的时候用 例:给出一个长度为n的序列A,求A中所有长度为m的连续子序列的最大值 解法就是 用一个双端队列 始终保持队列中的元素的个数为m 求最大值就单调递减队列 从头开始遍历每个位置 那么队头即为每个子序列的最大值 例题: Sliding Window POJ - 2823 这个求最大和最小值 用两个双端队列 切记 能一个循环完事...

weixin_30697239的博客 90

【单调队列】poj2823_Sliding Window

题目链接 http://poj.org/problem?id=2823 【题解】 这个题目就是纯模板题,但是这个题目有很多坑点,首先这个题目是多组输入的,然后这个输出还卡我们时间 #include<stdio.h> #include<iostream> using namespace std; const int N = 1e6+10; int IM[N],Im[...

Z_sea的博客 264

POJ 2823 Sliding Window (单调队列)

/* poj 2823 8012K 5344MS */ #include #include #define MAXN 1000005 #define MAX_INT 2147483647 using namespace std; int que_min[MAXN][2],que_max[MAXN][2],ans_min[MAXN],ans_max[MAXN]; //que二维数组,[]

公孙轩辕,一眼千年 384

[POJ 2823]Sliding Window[单调队列]

题目链接:[POJ 2823]Sliding Window[单调队列] 题意分析: 包含n个数字的数列,用一个长度为k的窗口移动从1开始向右移动,每次输出窗口中的最小值和最大值。分两行输出结果:最小值输出到上行,最大值输出到下行。 解题思路: 考虑每次移动窗口要进行的操作,总共有两种,增加一个数,删去一个数。考虑到需要涉及到删除操作,我们使用单调队列来进行维护。 L代表队列的左端,R代表

闲停 571

poj2823Sliding Window——单调队列

题目:http://poj.org/problem?id=2823 单调队列模板。 代码如下: #include<iostream> #include<cstdio> using namespace std; int n,k,a[1000005],mx[1000005],mn[1000005]; int main() { scanf("%d...

aodan5477的博客 117

POJ2823 Sliding Window【单调队列】

Sliding Window Time Limit:12000MS Memory Limit:65536K Total Submissions:76785 Accepted:21745 Case Time Limit:5000MS Description An array of sizen≤ 106is given to you. T...

逐梦者 321
上一篇: DP/單調隊列::poj3250 Bad Hair Day
下一篇: 时间代价分析
初四
博客等级 码龄15年 3粉丝 19原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值