洛谷 P1440 求m区间内的最小值

洛谷 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;
}

原文地址:https://www.cnblogs.com/fusiwei/p/13926120.html