1. 程式人生 > 實用技巧 >洛谷 P1440 求m區間內的最小值

洛谷 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\n",q.front().second);
	}
	return 0;
}