单调队列与单调栈<1>——单调队列

news2025/1/10 21:32:15

单调队列,即队列里的元素单调递增或递减。一般用于求区间内的最值问题。

模板题:P1886

暴力的话很简单,O(n^2)搞定。但是对于n\leq 10^6来说肯定TLE。所以我们要用单调队列来解决这道题。因为单调队列中元素大小单调递增或递减,所以,队首必定是最小或最大。因此,我们只需一直保持单调队列单调即可。

单调队列和普通队列的区别在于单调队列既可以从队首出队,也可以从队尾出队。所以本期的所有题目都是用STL里的deque实现的。

//模板题的代码没有任何坑,可以放心使用
#include <bits/stdc++.h>
using namespace std;
const int maxn=1000005;
struct node{
    int idx;
	int val;
}a[maxn];
deque<node> dq_mx,dq_mn;
int ans[2][maxn];
int main(){
    int n,m,k,cnt=0;
    cin>>n>>k;
    for(int i=1;i<=n;i++){
    	cin>>a[i].val;
    	a[i].idx=i;
        while(!dq_mx.empty() && a[i].val>=dq_mx.back().val)
        	dq_mx.pop_back();
        while(!dq_mn.empty() && a[i].val<=dq_mn.back().val)
        	dq_mn.pop_back();
        dq_mx.push_back(a[i]);
        dq_mn.push_back(a[i]);
        while(i-k>=dq_mx.front().idx)
        	dq_mx.pop_front();
        while(i-k>=dq_mn.front().idx)
        	dq_mn.pop_front();
        if(i>=k){
            ans[0][++cnt]=dq_mx.front().val;
            ans[1][cnt]=dq_mn.front().val;
        } 
    }
    for(int i=1;i<=cnt;i++)
    	cout<<ans[1][i]<<' ';
    cout<<endl;
    for(int i=1;i<=cnt;i++)
    	cout<<ans[0][i]<<' ';
    return 0;
}

P1440:

和P1886基本一样。

#include <bits/stdc++.h>
using namespace std;
const int maxn=2000005;
struct node{
    int val;
    int pos;
}a[maxn];
deque<node> dq_mn;
int ans[maxn]; 
int main(){
	int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i].val);
        a[i].pos=i-1;
    }
    ans[0]=0;
    for(int i=1;i<n;i++){
        while(!dq_mn.empty() && dq_mn.back().val>=a[i].val)
            dq_mn.pop_back();
        dq_mn.push_back(a[i]);
        while(!dq_mn.empty() && dq_mn.front().pos<i-m)
            dq_mn.pop_front();
        ans[i]=dq_mn.front().val;
    }
    for(int i=0;i<n;i++)
        printf("%d\n",ans[i]);
	return 0;           
}

P1714:

首先,求出原数组的前缀和,然后用单调队列求最值即可。但是,记得初始化!!!!!!!!

#include <bits/stdc++.h>
using namespace std;
const int maxn=500005;
int sum[maxn],ans=-INT_MAX;
deque<int> dq;
int main(){
	int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
    	int p;
        cin>>p;
        sum[i]=sum[i-1]+p;
    }
    //初始化dq.push_back(0);
    for(int i=1;i<=n;i++){
        while(dq.front()+m<i)
            dq.pop_front();
        ans=max(ans,sum[i]-sum[dq.front()]);
        while(!dq.empty() && sum[dq.back()]>=sum[i])
            dq.pop_back();
        dq.push_back(i);
    }
    cout<<ans<<endl;
    return 0;
}

P2629:

我们把环变成链,也就是说,将A数组复制一遍放在结尾,求前缀和,然后用单调队列求最值。

#include <bits/stdc++.h>
using namespace std;
const int maxn=2000005;
int A[maxn],sum[maxn];
struct node{
    int idx;
    int val;
};
deque<node> dq;
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>A[i];
        A[i+n]=A[i];
        if(i==0)
			sum[i]=A[i];
        else
			sum[i]=sum[i-1]+A[i];
    }
    //将A数组复制一遍求前缀和
    //for(int i=n;i<2*n;i++)
	//	sum[i]=sum[i-1]+A[i];
    int k=0,ans=0;
    for(int i=0;i<2*n-1;i++){
        if(!dq.empty() && i-dq.front().idx>=n)
			dq.pop_front();
        while(!dq.empty() && dq.back().val>sum[i])
			dq.pop_back();
        dq.push_back((node){i,sum[i]});
        if(i==n-1 && dq.front().val>=0)
			ans++;
        else if(i>n-1 && dq.front().val-sum[k]>=0)
			ans++;
        if(i>n-1)
			k++;
    }
    cout<<ans<<endl;
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TwinCAT3 新建项目教程

文章目录 打开TwinCAT 新建项目&#xff08;通过TcXaeShell&#xff09; 新建项目&#xff08;通过VS 2019&#xff09;

案例精选 | 聚铭网络助力石家庄市栾城区中医院防护体系焕新升级

石家庄市栾城区中医院&#xff0c;坐落于栾城这块历史悠久的热土上&#xff0c;占地广阔&#xff0c;达4200平方米&#xff0c;作为一家享有盛誉的二级甲等综合性中医医疗机构&#xff0c;它不仅是传统医学与现代科技融合的典范&#xff0c;更是区域医疗卫生服务的重要支柱。 …

【JavaScript】详解数组方法 fill()

文章目录 一、fill()方法简介二、fill()方法的基本用法三、fill()方法的进阶用法四、实际应用案例五、注意事项六、总结 在JavaScript中&#xff0c;fill()方法是数组操作中一个非常有用的方法。它可以快速地用特定值填充数组的全部或部分内容。理解fill()方法的工作机制和使用…

深度对话安天王小丰:我们应该从微软“蓝屏”事件学到什么?

ITValue 国内厂商和CrowdStrike的差距&#xff0c;相比于国外厂商和CrowdStrike的差距更大。 作者&#xff5c;张帅 编辑&#xff5c;盖虹达 首发&#xff5c;钛媒体APP ITValue 我们赖以生存的数字世界&#xff0c;可能比想象得还要脆弱。 近日&#xff0c;全球范围内的微软Wi…

基于Gitlab CI+Argo CD的Gitops实践

项目简介 项目说明 本项目构建了一个基于GitOps理念的完整CI/CD管道&#xff0c;旨在实现软件开发与运维的高度自动化和一致性。通过GitLab、GitLab Runner&#xff08;部署于Kubernetes&#xff09;、Maven、Java、SonarQube、Harbor以及Argo CD等工具的紧密协作&#xff0c…

二叉树的存储

二叉树的存储 满二叉树或者完全二叉树可以采用顺序存储&#xff0c;普通二叉树一般采用链式存储 节点的结构体原型 typedef int DataType typedef struct node { DataType data&#xff1b; struct node *L&#xff1b; struct node *R&#xff1b; }twotree&#xff…

【数值计算方法】数值积分微分-python实现-p3

原文链接&#xff1a;https://www.cnblogs.com/aksoam/p/18332123 更多精彩&#xff0c;关注博客园主页&#xff0c;不断学习&#xff01;不断进步&#xff01; 我的主页 csdn很少看私信&#xff0c;有事请b站私信 博客园主页-发文字笔记-常用 有限元鹰的主页 内容&#xf…

【阅读笔记】红外sensor的ITR、IWR读出模式分析

一、ITR、IWR读出模式分析 InGaAs短波红外探测器具有ITR和IWR两种工作模式。两种工作模式都包括三个相同的工作过程&#xff0c;即复位、积分和读出。每个工作过程的开始与结束都由配置指令码控制&#xff0c;配置指令码包括复位指令、开始积分指令、开始读出指令和读出结束指…

找到学习的引擎,更让你进入心流状态的高效学习

一、心流状态的启动秘籍 1. 简单开始&#xff1a;找到学习的入口 从简单的任务开始&#xff0c;比如整理学习空间或列出学习计划&#xff0c;让大脑逐渐适应学习的节奏。 2. 环境塑造&#xff1a;打造专注的学习空间 清理桌面&#xff0c;减少干扰&#xff0c;比如将手机置…

探索未来之境:揭秘元宇宙(Metaverse)

在科技与想象的交界&#xff0c;一个名为“元宇宙”&#xff08;Metaverse&#xff09;的概念正逐渐从科幻走入现实&#xff0c;预示着人类交互与体验的全新纪元。元宇宙不仅是技术的飞跃&#xff0c;更是未来生活方式的蓝图&#xff0c;它模糊了虚拟与现实的界限&#xff0c;开…

Ubuntu配置项目环境

目录 一、Xshell连接云服务器 二、切换到root用户 三、安装jdk 四、安装tomcat 五、安装mysql 1、安装mysql服务器 2、卸载mysql服务器 六、正式进行程序的部署 一、Xshell连接云服务器 要想使用xshell连接上云服务器就需要明确云服务器的几个信息&#xff1a; 1&…

Qt 的径向渐变的类QRadialGradient 学习笔记

QRadialGradient 是 PySide&#xff08;即 Qt 的 Python 绑定&#xff09;中用于创建径向渐变的类。径向渐变是一种从中心点向外扩展的渐变效果&#xff0c;与线性渐变不同&#xff0c;线性渐变是沿着一条直线变化的。基本概念 QRadialGradient 可以用来为图形项、形状或背景…

python调用IP摄像头

一、手机端下载软件 至于怎么下载&#xff1f;&#xff1f; 直接去浏览器搜索&#xff0c;并找到对应的下面的这个即可&#xff0c;也可以用我提供的这个链接去下载 IP Camera摄像头app下载-IP Camera无线摄像头app下载 v28.7.3手机客户端 - 多多软件站 二、勾选RTSP服务器&…

【Web 前端开发】vue3开发环境部署

1、安装 Node.js 和 npm 访问 Node.js 官网 下载并安装最新的 LTS 版本。 安装完成后&#xff0c;打开命令行工具&#xff0c; 输入 node -v 和 npm -v 检查安装是否成功。 node -vnpm -v 如下图&#xff1a; 2、安装 Vue CLI 在命令行工具中输入以下命令安装 Vue CLI&…

【刷题汇总 -- 游游的重组偶数、体操队形、二叉树中的最大路径和】

C日常刷题积累 今日刷题汇总 - day0281、游游的重组偶数1.1、题目1.2、思路1.3、程序实现 2、体操队形2.1、题目2.2、思路2.3、程序实现 -- 递归(dfs) 剪枝 3、二叉树中的最大路径和3.1、题目3.2、思路3.3、程序实现 -- 递归树形dp 4、题目链接 今日刷题汇总 - day028 1、游游…

快递进小区太难了!大量快递到底放在哪里?

如今&#xff0c;快递小哥是市民生活中不可或缺的角色&#xff0c;但他们在服务城市、满足市民需求的同时&#xff0c;也会遇到一些不被居民理解的情况。 “为什么不让进小区” “一些高档小区管得严&#xff0c;不让我们快递员进小区送货&#xff0c;但是这个标注是送货上楼的…

Netty 必知必会(四)—— Channel-Pipeline 责任链

一、责任链模式 适用场景: 对于一个请求来说&#xff0c;如果每个对象都有机会处理它&#xff0c;而且不明确到底是哪个对象会处理请求时&#xff0c;我们可以考虑使用责任链模式实现它&#xff0c;让请求从链的头部往后移动&#xff0c;直到链上的一个节点成功处理了它为止 …

openeuler的mariadb数据库安装

下载数据库 yum install mariadb-server 如果出现文件冲突如下删除即可 yum remove selinux-policy-targeted --nobest --nobest 无视需求关系 systemctl enable --now mariadb.service #自启动 mysql_secure_installation 初始化Mysql根据自己需求填y|n 第一次进…

运动耳机界的“冠军之选”!奥运会冠军同款耳机曝光!

近期&#xff0c;相信大家的目光都被奥运会所吸引&#xff0c;作为一个有着多年使用蓝牙耳机经验的专业测评师&#xff0c;在此告诉大家&#xff0c;其实有很多奥运会选手在训练的时候会戴耳机&#xff0c;因为这样不仅可以缓解训练中的疲惫&#xff0c;而且可以增加训练的激情…