007. 求m区间内的最小值(洛谷P1440)

news/2024/12/28 20:14:39/文章来源:https://www.cnblogs.com/zyihan-crz/p/18637894

007. 求m区间内的最小值(洛谷P1440)

题目描述

一个含有 \(n\) 项的数列,求出每一项前的 \(m\) 个数到它这个区间内的最小值。若前面的数不足 \(m\) 项则从第 \(1\) 个数开始,若前面没有数则输出 \(0\)

输入格式

第一行两个整数,分别表示 \(n\)\(m\)

第二行,\(n\) 个正整数,为所给定的数列 \(a_i\)

输出格式

\(n\) 行,每行一个整数,第 \(i\) 个数为序列中 \(a_i\) 之前 \(m\) 个数的最小值。

样例 #1

样例输入 #1

6 2
7 8 1 4 3 2

样例输出 #1

0
7
7
1
1
3

提示

对于 \(100\%\) 的数据,保证 \(1\le m\le n\le2\times10^6\)\(1\le a_i\le3\times10^7\)

题解

单调队列嘛,就是单调的队列
单调递增或者单调递减
所以说答案(也就是最优解)就存在队首,而队尾则是最后进队的元素
那么怎么判断这个数是否还在这个区间之内呢?
这时候就要用到一个结构体了

struct node
{int val;int pos;
};

val存储该点的值,pos存储该点的位置,就是为了能够在循环中判断能否把这个点踢掉
根据单调队列的性质,如果我们想要将一个新的点插入
(你比如)
先看样例 当我们要在队列中插入第m + 1个元素的时候
也就是1
现在队列中是 7 8
他们分别对应的位置 1 2
因为要从队尾插入嘛
你想想你排队 如果有人一下子直接到队首,你是不是会很不爽,认为他没有资格
但是如果他一个一个插队,从队尾挨个上来,你不爽也没用的
所以单调队列也是队列,也是如此,没有元素有资格直接到头
你要慢慢来
这时候代码就很明显了

while((head <= tail)&&(v[tail].val >= a[i - 1]))tail--;v[++tail].val = a[i - 1];//这里i - 1要解释一下,因为该题0也要计算进去

那么对于已经过期的元素怎么办呢?
如果一个元素从队首开始t人
如果队首没有过期 其他的元素你管他干嘛?又不是答案,现在又用不到
如果队首过期,那就t掉他继续t下一个 直到找到一个没有过期的,然后参考上一步就OK了

while((head <= tail)&&(v[head].pos < i - m))head++;

接下里贴代码

手写版:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int n,m;
inline int rd()
{int data = 0;int f = 1;char ch = getchar();while(ch < '0'||ch > '9'){if(ch == '-')f = -1;ch = getchar();}while(ch >= '0'&&ch <= '9'){data = (data<<3) + (data<<1) + ch - '0';ch = getchar();}return f * data; 
}
int a[2000010];
int min_que[2000010];
struct node
{int val;int pos;
}v[2000010];
void write(int x)
{if(x > 10)write(x/10);putchar(x%10 + '0');	
}
int main()
{scanf("%d%d",&n,&m);for(int i = 0;i < n;i++)a[i] = rd();int head = 1,tail = 0;min_que[0] = 0;for(int i = 1;i < n;i++){while((head <= tail)&&(v[tail].val >= a[i - 1]))tail--;v[++tail].val = a[i - 1];v[tail].pos = i - 1;while((head <= tail)&&(v[head].pos < i - m))head++;min_que[i] = v[head].val;}for(int i = 0;i < n;i++)printf("%d\n",min_que[i]);
}

STL版:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<deque>
using namespace std;
const int maxsize = 2000010;
int n,m;
struct node
{int val;int pos;
}A[maxsize];
deque<node> min_Q;
inline int rd()
{int data = 0;int f = 1;char ch = getchar();while(ch < '0'||ch > '9'){if(ch == '-')f = -1;ch = getchar();}while(ch >= '0'&&ch <= '9'){data = (data<<3) + (data<<1) + ch - '0';ch = getchar();}return f * data; 
}
int min_que[maxsize]; 
int main()
{n = rd(),m = rd();for(int i = 1;i <= n;i++){A[i].val = rd();A[i].pos = i - 1;}min_que[0] = 0;for(int i = 1;i < n;i++){while(!min_Q.empty()&&min_Q.back().val >= A[i].val)min_Q.pop_back();min_Q.push_back(A[i]);while(!min_Q.empty()&&min_Q.front().pos < i - m)min_Q.pop_front();min_que[i] = min_Q.front().val;}for(int i = 0;i < n;i++)printf("%d\n",min_que[i]);	}

小小用了一下快读,不懂的同学可以直接用scanf代替
不要用cin会超时(除非你把std同步关掉)
如果这道题你过了,就可以看一下以下两题,都差不多,难度不会太大,注意边界条件就可以过了
传送门: P1886滑动窗口、P2032扫描

最后再介绍一下这个优先队列的作用,一般是用来优化DP,OI中较少直接仅仅考察该算法,同常都是和DP结合起来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/860522.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记 - 汉明码

汉明码属于一种具备纠错功能的线性分组码。 在数据传输时,受外界干扰影响,单个比特可能产生差错。汉明码借助添加的冗余监督位,依照特定规则精准判断出错比特位,进而完成纠正,确保信息恢复如初,宛如给数据披上一层“防护甲”,使其即便处于复杂环境,也能维持精准可靠,在…

学习笔记 - 摩斯电码

摩斯电码由美国人塞缪尔莫尔斯等人发明,仅用“”(点)与“-”(划)两种符号,按不同排列组合来代表英文字母、数字和标点。起初应用于有线电报,后应用到无线电通信,曾长期担任关键角色。如今,虽因通信技术革新而不再主流,但在业余无线电爱好者群体中依旧流行,紧急救援时…

2024第一届Solar杯应急响应挑战赛WP

对于一个只学了2个月的小白来说这种比赛难度还是太高了,还要沉淀一下QAQ 内存取证-1 题目描述 题目文件:SERVER-2008-20241220-162057 请找到rdp连接的跳板地址 flag格式 flag{1.1.1.1} 先imageinfo然后netscan F:\CTF软件合集\Misc杂项\隐写工具\取证类\volatility\Volatili…

App信息收集

引子:上一章主要介绍了信息收集中的Web信息收集,包括要收集什么信息、该怎样去做等内容。而本章则简单介绍一下当目标为App时该如何进行信息收集。由于本篇章为信息收集篇,因此很多内容笔者并没有深究(ps:其实是深究不明白),或许等一轮学完后再回头看时会明白很多吧。免…

基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真

1.算法运行效果图预览 (完整程序运行后无水印)PSO优化过程: PSO优化前后,模型训练对比: 数据预测对比: 误差回归对比: 2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)LR = g1(1); NN1 = floor(g1…

软件工程我依然爱你

用一个词总结软工实践课程——Never forget!!!😚😚😚 前言现在是2024年12月27号下午4点,是我考完软件工程课程的四小时,也是我软工实践结束的第27天。我竟莫名对软件工程有点不舍,特别是我们倾注大量心血的项目——福小研,我愿称之为我心里最好的项目之一,或许它…

2024省选联测1

2024省选联测1题目来源: 2024省选联测1 \(T1\) HZTG5808. interval \(40pts\)原题: QOJ 1173. Knowledge Is..考虑按照左端点升序排序后反悔贪心。分别维护已经匹配的区间对和未被匹配的区间,若当前区间 \(a\) 可以和前面剩余的未被匹配的区间匹配则直接匹配;否则尝试找到一…

2024-2025-1 20241407《计算机基础与程序设计》第十四周学习总结

作业信息这个作业属于哪个课程 2024-2025-1计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十四周作业这个作业的目标 学习二进制文件和文本文件,文件的打开和关闭,顺序读写与随机读写,标准输入和输出及其重定向作业正文 本博客教材学习内容总结…

GraphMAE2(解码增强型掩码自监督图学习器)

GraphMAE2: A Decoding-Enhanced Masked Self-Supervised Graph Learner 解码增强型掩码自监督图学习器 背景 ​ 近年来,自监督学习(Self-supervised Learning,SSL)得到了广泛的探索,特别是生成式自监督学习在自然语言处理以及其他人工智能领域已经取得了新兴的成功,像…

PTA第7~8次大作业分析及总结

一、前言 本次Blog为第七~八次大作业的总结。两次大作业主要考察抽象类及继承方面的相关内容,是在第六次大作业基础上的进一步升级,难度大幅提升,由于前面的作业我没有很好地完成,这两次大作业也没有拿到好成绩,这也算是提醒我:在进行一个设计时要提前为后续更加预留空间…

python3网络爬虫开发实战-第2版PDF免费下载

本书介绍了如何利用 Python 3 开发网络爬虫。本书为第 2 版,相比于第 1 版,为每个知识点的实战项目配备了针对性的练习平台,避免了案例过期的问题。另外,主要增加了异步爬虫、JavaScript 逆向、App 逆向、页面智能解析、深度学习识别验证码、Kubernetes 运维及部署等知识点…

Java大作业总结

Java大作业总结 目录Java大作业总结一.前言第七次大作业1.设计与分析2.踩坑心得(一)电阻值处理(二)设备状态更新顺序3.改进建议(一)错误处理与异常机制(二)性能优化(三)代码结构调整第八次大作业1.设计与分析2.踩坑心得3.改进建议期末总结 一.前言 这2次大作业都是前…