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;
    }
    
  • 相关阅读:
    Java的学习笔记(二)
    Java的学习笔记
    简单界面生成
    登录界面
    播放器
    java计划
    求和
    修改后的抽奖系统
    第十周作业
    JAVA第五次作业
  • 原文地址:https://www.cnblogs.com/loceaner/p/11298919.html
Copyright © 2011-2022 走看看