单调队列

本文是作者的第一篇博客,探讨了单调队列的概念,它用于维护区间最值,尤其适用于单调递减序列。单调队列的特性是头部始终保存当前区间的最值,新元素的插入可能会导致违反单调性的旧元素被移除。作者通过举例最大子序和问题来帮助读者更好地理解单调队列的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明:这是本人的第一篇博客,如有错误请多加指正,虚心接受意见和批评,欢迎一起学习和讨论问题.

单调队列:估计学过算法和数据结构的人都不会陌生,在队列的基础上,让我们谈论一下单调队列的问题,首先呢单调队列是用来维护区间最值的(单调递减序列,维护区间最大值,反之亦成立),单调区间的最值永远都在头部放着,队列尾部插入元素,为了维护单调性,待插入元素会把所有违反单调性的元素踢出去,当前区间的最大值永远是单调队列的队首元素.

通俗一点来说,比你入队晚,性质还比你好的元素就会把队列里的某些元素踢掉,被踢掉的元素永远不会有机会成为一定范围内的最值.

下面一道经典的例题,最大子序和来帮助读者进一步去理解单调队列.

题目链接:http://oj.haizeix.com/problem/270

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;
typedef long long ll;
#define SIZE 300000
ll arr[SIZE], ans;
int que[SIZE];
int head, tail;

int main() {
    int n, m;
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; i++) {
        scanf("%lld", &arr[i]);
        arr[i] = arr[i] + arr[i 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值