文章目录
前言
单调队列介绍
在前面我们介绍了,单调队列使用方法 没有了解过的 可以去我的文章中查看
接下来 让我们 更加细致的去练习一下单调队列常用的套路
单调队列模板:
cin>>n>>k; //输入序列的长度和窗口的长度
for(int i=1;i<=n;i++) cin>>a[i];
//单调递减队列模板
for(int i=1;i<=n;i++){
//只要脱离了窗口就弹出
while(!q.empty()&&q.front()<=i-k)q.pop_front();
//只要队尾元素大于当前元素 不满足单调性 弹出 并插入当前元素
while(!q.empty()&&a[q.back()]>a[i])q.pop_back();
q.push_back(i);
//如果窗口满了 就输出
if(!q.empty()&&i>=k)cout<<a[q.front()]<<" ";
}
二、单调队列习题:
1.单调队列题单:
单调队列 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
2.习题讲解(附代码):
2.1 [NOIP2010 提高组] 机器翻译
题目大意:
给你两个整数 M M M, N N N 代表机器容量和文章的长度,刚开始机器没有存任何单词,现在给你一个单词要你查出翻译,如果机器内存中有就从内存中取,如果没有就去外存找,若内存中已存入 M M M 个单词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词,要你求从外存读取的次数
思路: 这道题思路很明确了 软件会清空最早进入内存的那个单词 毫无疑问解这个题要用到队列的性质 ,首先用一个bool数组记录一下当前单词存不存在,若存在就跳过,若不存在,就要从外存去找,答案次数加一,并将当前单词放入队列,bool 数组更新为true,如果满了那就 bool数组更新为 false 并且弹出队首
AC代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#define int long long
using namespace std;
const int N = 1010;
queue<int> q;
bool hashset[N];
int m,n;
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>m>>n;
int cnt=0;
while(n--){
int x;cin>>x;
if(!hashset[x]){
//如果不存在
cnt++; //答案次数加一
q.push(

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



