zoukankan      html  css  js  c++  java
  • 洛谷 P1440 求m区间内的最小值

    洛谷 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
    ";
    	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]] << '
    ';
    	}
    	return 0;
    }
    
  • 相关阅读:
    docker入门
    spring aop切面入门
    java 拉姆达 lamdba get
    Spring 3
    Spring 进阶二
    腾讯云 视频 点播 视频上传接口
    js 实时获取后台数据 Spring
    Spring 进阶一
    hibernate 第四天 重点查询的方式
    hibernate 第三天
  • 原文地址:https://www.cnblogs.com/loceaner/p/11298919.html
Copyright © 2011-2022 走看看