• 洛谷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;
    }
  • 相关阅读:
    gitlab CI
    arm模拟环境qemustatic
    golang 离线使用模块
    企业微信机器人推送消息
    贴片丝印对照
    Air32F103CBT6
    RTT F411CE
    STM32F411CEU6
    CMakeLists.txt使用
    websocket测试(nodered)
  • 原文地址:https://www.cnblogs.com/Hoyoak/p/11386240.html
Copyright © 2020-2023  润新知