洛谷 P1440 求m区间内的最小值
题目描述
一个含有 nn 项的数列,求出每一项前的 mm 个数到它这个区间内的最小值。若前面的数不足 mm 项则从第 11 个数开始,若前面没有数则输出 00。
输入格式
第一行两个整数,分别表示 nn,mm。
第二行,nn 个正整数,为所给定的数列 a_ia**i。
输出格式
nn 行,每行一个整数,第 ii 个数为序列中 a_ia**i 之前 mm 个数的最小值。
题解:
滑动窗口。
代码:
#include<cstdio>
#include<deque>
using namespace std;
const int maxn=2e6+6;
int n,k;
int a[maxn];
deque<pair<int,int> > q;
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
puts("0");
for(int i=2;i<=n;i++)
{
while(!q.empty() && a[i-1]<q.back().second)
q.pop_back();
q.push_back(make_pair(i-1,a[i-1]));
while(q.front().first<=i-1-k)
q.pop_front();
printf("%d
",q.front().second);
}
return 0;
}