首页 > 其他分享 >P1886 滑动窗口 /【模板】单调队列

P1886 滑动窗口 /【模板】单调队列

时间:2024-01-21 11:56:03浏览次数:23  
标签:P1886 LL mind back pop 队列 int 模板

P1886 滑动窗口 /【模板】单调队列

https://www.luogu.com.cn/problem/P1886

 

思路

https://zhuanlan.zhihu.com/p/346354943

 

Code

https://www.luogu.com.cn/record/143623041

LL n, k;
LL a[1000005];
deque<LL> maxd, mind;


int main()
{
    cin >> n >> k;

    for(int i=0; i<n; i++){
        cin >> a[i];
    }

    LL loop = n - k + 1;
    
    /* ---- handle min case ---- */
    for(LL i=0; i<loop; i++){
        // first loop, enque all k item
        if (i == 0){
            for(LL j=0; j<k; j++){
                while(mind.size()){
                    if (a[mind.back()] >= a[j]){
                        mind.pop_back();
                    } else {
                        break;
                    }
                }

                mind.push_back(j);
            }
        // other case, only care about new comer
        } else {
            if (mind.size() && i - mind.front() >= 1){
                mind.pop_front();
            }

            int j = i + k - 1;
            while(mind.size()){
                if (a[mind.back()] >= a[j]){
                    mind.pop_back();
                } else {
                    break;
                }
            }

            mind.push_back(j);
        }

//        cout << "------------loop i = " << i << endl;
//        for (int n : mind)
//            cout << n << ' ';
//        cout << endl;

        cout << a[mind.front()] << " ";
    }
    
    cout << endl;
    
    /* ---- handle max case ---- */
    for(LL i=0; i<loop; i++){
        // first loop, enque all k item
        if (i == 0){
            for(LL j=0; j<k; j++){
                while(maxd.size()){
                    if (a[maxd.back()] <= a[j]){
                        maxd.pop_back();
                    } else {
                        break;
                    }
                }

                maxd.push_back(j);
            }
        // other case, only care about new comer
        } else {
            if (maxd.size() && i - maxd.front() >= 1){
                maxd.pop_front();
            }

            int j = i + k - 1;
            while(maxd.size()){
                if (a[maxd.back()] <= a[j]){
                    maxd.pop_back();
                } else {
                    break;
                }
            }

            maxd.push_back(j);
        }

//        cout << "------------loop i = " << i << endl;
//        for (int n : maxd)
//            cout << n << ' ';
//        cout << endl;

        cout << a[maxd.front()] << " ";
    }

    cout << endl;


    return 0;
}

 

标签:P1886,LL,mind,back,pop,队列,int,模板
From: https://www.cnblogs.com/lightsong/p/17977678

相关文章

  • 代码随想录算法训练营第十天| 232.用栈实现队列 225. 用队列实现栈
    LeetCode232.用栈实现队列题目链接:232.用栈实现队列思路:用两个栈实现队列 LeetCode  225.用队列实现栈 题目链接:225.用队列实现栈 思路:一个队列对栈进行实现(实现栈中的方法) ......
  • c++函数模板
    一.模板概念:就是建立通用的摸具,大大提高复用性特点:模板不可以直接使用,它只是一个框架模板的通用并不是万能的c++提供两种模板机制函数模板和类模板二.函数模板作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表作用:建立一个通用函数......
  • redis实现延时队列(附完整代码)
    最近在复习所学过的队列的知识,像什么LinkedBlockingDeque。ArrayBlockingQueue,还有ribbitmq里的乱七八糟的,其本质我感觉啊这些技术就是一些队列,只不过大体上分为单机队列和分布式队列而已,当然本文的重点在于redis实现延时队列啊,可能有人会说,用ribbitmq这个专门的消息中间件实现延时......
  • C++模板例子
    title:"C++模板例子"date:2023-11-02T01:05:25+08:00tags:["C++"]categories:[]draft:falsetoc:true#include<vector>#include<type_traits>usingnamespacestd;classAA{};classBB{};classTest{public:templ......
  • 【数据结构】详谈队列的顺序存储及C语言实现
    循环队列及其基本操作的C语言实现前言大家好,很高兴又和大家见面啦!!!在上一篇内容中,我们在介绍完队列的基本概念、重要术语以及基本操作后,又回顾了一下数据结构的三要素——数据的逻辑结构、数据的存储结构以及数据的运算。队列这种数据结构我们已经介绍了它的逻辑结构以及数据运算......
  • 算法模板 v1.3.1.20240120
    算法模板v1.1.1.20240115:之前的历史版本已经不可寻,创建了第一份算法模板。v1.2.1.20240116:删除“编译”-“手动开栈”与“编译”-“手动开O优化”;将“编译”-“CF模板”中的第20行代码cin>>T;注释;删除“读写”及其目录下的内容;删除“图论”-“欧拉图”-“混合图”;删除“图论”-......
  • Avalonia TemplatedControl (模板控件)
    在ava中的模板控件相当于wpf中的自定义控件在下面示例中,将绘制一个文本框和一个按钮,用来组合一个搜索控件在app.axaml中加入样式<Application.Styles><FluentTheme/><StyleIncludeSource="/TemplatedControl1.axaml"/></Application.Styles>引入并使用xmlns......
  • iReport使用zxing二维码模板设置方式
    1.首先需要给软件配置引用包core和javase;工具-选项-iReport-ClassPath, 2.然后组件就直接使用Image的,选文件时直接取消就行;3.重点:设置属性ImageExpression:com.google.zxing.client.j2se.MatrixToImageWriter.toBufferedImage(newcom.google.zxing.qrcode.QRCodeWriter(......
  • Key模板
    #ifndefKEY_H#defineKEY_H#include"main.h"#ifdefKEY_C#include"stm32f10x_gpio.h"#include"sys.h"#defineDoubDelay500#defineLongDelay3000#defineCounterMax20000voidKEY_Shift(void);#endif#defineNumO......
  • 用户自定义模板中数据区域
    在实际的Word文档开发中,经常需要自动填充数据到Word模板中,以生成动态的Word文档,那么应该如何编辑制作Word模板呢?方法一:直接打开Word文件插入书签假如使用数据区域(DataRegion)来定义模板中动态填充数据的位置,那么直接打开一个Word文件,在其中添加“PO_”开头的书签即可制作word模板......