一个含有n项的数列(n<=2000000),求出每一项的前m个数到它这个区间内的最小值。若前面的数不足m项则从第1个数开始,若前面没有数则输出0。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<math.h>
#include<set>
using namespace std;
int a[2000100];
int q[2000100];
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
int hh = 0, tt = -1;
for (int i = 0; i < n; i++)
{
if (hh<tt && i - q[hh]>m)//判断是否超过区间范围
{
hh++;
}
if (i == 0)
{
printf("0\n");
}
else
{
printf("%d\n", a[q[hh]]);
}
while (hh <= tt && a[q[tt]] >= a[i])
{
tt--;//维护队列的单调性
}
q[++tt] = i;
}
return 0;
}