[lUOGU1440] 求m区间内的最小值

题目

https://www.luogu.org/problemnew/show/P1440

求出每一项前的m个数到它这个区间内的最小值


解题思路

单调队列的模板题。在第一个的时候,肯定是输出“0”的,然后可以调用双端队列{deque}容器,注意每次压进去的是“编号”,而不是数字。然后每次让这个容器的数量维护在m以内


代码

#include
#include
using namespace std; 
deque<int> q;
int n,m,a[2000001]; 
int main()
{
    scanf("%d%d",&n,&m); putchar(48);putchar(10);
    for (int i=1;i//最后一个可以不用读入
    {
        scanf("%d",&a[i]); 
        while (q.size()&&a[i]//弹出队列末尾内比这个数小的数的编号
        q.push_back(i); //插队
        while (i-q.front()>=m) q.pop_front(); //维护
        printf("%d\n",a[q.front()]); //输出
    }
}

你可能感兴趣的:(单调队列)