P1440 求m区间内的最小值(单调队列)

简介: 算法

题意:

10.png

思路:用单调队列去不断进行筛数操作,O(n)扫一遍,两个while第一个while是使队列是单调的,如果不符合就弹数,第二个while是使队列里的元素要满足前m个。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+100;
int a[maxn];
deque<int >m1;
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    printf("%d\n",0);
    for(int i=1;i<n;i++){
        scanf("%d",&a[i]);
        while(m1.size()&&a[m1.back()]>a[i]){
            m1.pop_back();
        }
        m1.push_back(i);
        while(i-m>=m1.front()){
            m1.pop_front();
        }
        printf("%d\n",a[m1.front()]);
    }
    return 0;
}
相关文章
|
4月前
|
算法 测试技术 C#
【单调队列】LeetCode1499:满足不等式的最大值
【单调队列】LeetCode1499:满足不等式的最大值
【单调队列】LeetCode1499:满足不等式的最大值
|
4月前
|
C++
汇总区间(C++)
汇总区间(C++)
22 0
|
5月前
|
算法 测试技术 C#
C++ 算法:区间和的个数
C++ 算法:区间和的个数
|
11月前
二分 :数的范围
二分 :数的范围
40 0
|
12月前
|
C++
【LeetCode 327】区间和的个数
【LeetCode 327】区间和的个数
|
12月前
Leetcod 剑指offer 59 滑动区间最大值
Leetcod 剑指offer 59 滑动区间最大值
51 0
LeetCode 1877. 数组中最大数对和的最小值
一个数对 (a,b) 的 数对和 等于 a + b 。最大数对和 是一个数对数组中最大的 数对和 。
91 0
使用二分法解决旋转数组的最小数字的问题
使用二分法解决旋转数组的最小数字的问题
69 0
使用二分法解决旋转数组的最小数字的问题
|
Java Scala 开发者
使用递归求出最大值 | 学习笔记
快速学习使用递归求出最大值
122 0
|
机器学习/深度学习
数的范围———— 二分
给定一个按照升序排列的长度为 nn 的整数数组,以及 qq 个查询。 对于每个查询,返回一个元素 kk 的起始位置和终止位置(位置从 00 开始计数)。 如果数组中不存在该元素,则返回 -1 -1。
102 0