C++单调队列模板+基础题题单+习题讲解


前言

单调队列介绍

在前面我们介绍了,单调队列使用方法 没有了解过的 可以去我的文章中查看
接下来 让我们 更加细致的去练习一下单调队列常用的套路

单调队列模板:

 	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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值