洛谷 P1440 求m区间内的最小值

传送门

思路

由于数据范围很大,所以使用单调队列,和滑动窗口这道题类似

首先第一个数输出\(0\),因为第一个数之前没有数

然后通过样例我们发现,最后一个数并没有派上什么用场,所以循环\(n-1\)轮即可

这里的单调队列是记录的序号,每次输入\(a[i]\),检测它是不是比当前的队尾大,如果比队尾大直接入队,反之与队尾比较(\(r--\))直至比队尾大为止。当长度超过\(m\)时,\(l++\),最后的队首就是答案

代码

#include <iostream>
#include <cstdio>
using namespace std;

inline int read() {
    char c = getchar();
    int x = 0, f = 1;
    for( ; !isdigit(c); c = getchar()) if(c == '-') f = -1;
    for( ; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + (c ^ 48);
    return x * f;
}

const int N = 20000011;
int n, m, q[N], a[N], l = 1, r = 1, x;

int main() {
    n = read(), m = read();
    cout << "0\n";
    for(int i = 1; i < n; i++) {
        a[i] = read();
        while(a[q[r - 1]] >= a[i] && l < r) r--;
        q[r++] = i;
        if(i - q[l] + 1 > m) l++;
        cout << a[q[l]] << '\n';
    }
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
分享
头像
11-09 12:17
清华大学 C++
out11Man:小丑罢了,不用理会
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务