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

    题目描述

    一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值。若前面的数不足m项则从第1个数开始,若前面没有数则输出0。

    输入格式

    第一行两个数n,m。

    第二行,n个正整数,为所给定的数列。

    输出格式

    n行,第i行的一个数ai,为所求序列中第i个数前m个数的最小值。

    题解:单调队列队首维护区间最值即可,注意输出的位置,必须弹掉出了查询区间的数后再输出,同时

    注意到题干是作闭右开的区间,所以对于每次输出先找寻最小值,再用新元素进行更新维护单调性。

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    
    using namespace std;
    
    int n,m;
    struct node
    {
        int pos,data;
    };
    node q[2000005];
    
    int main()
    {
        scanf("%d%d",&n,&m);
        int head=1,tail=0;
        for(int i=1;i<=n;i++)
        {
            int x;
            scanf("%d",&x);
            while(head<=tail&&q[head].pos<(i-m)) head++;
            if(i==1) printf("0
    ");
            else printf("%d
    ",q[head].data);
            while(head<=tail&&q[tail].data>=x) tail--;
            q[++tail].pos=i; q[tail].data=x;
        }
        return 0;
    }
  • 相关阅读:
    1.1 HTML5简介
    MATLAB基础知识——1.1MATLAB系统变量
    初识MATLAB
    Z-Stack
    [C语言]关于struct和typedef struct
    [Zigbee]定时器1
    常用数论算法
    SPFA&邻接表 PASCAL
    kruskal算法-Pascal
    懒惰的JY--关于遍历
  • 原文地址:https://www.cnblogs.com/Hoyoak/p/11386240.html
Copyright © 2011-2022 走看看