洛谷 P1886 滑動窗口

題目描述

現在有一堆數字共N個數字(N<=10^6),以及一個大小爲k的窗口。現在這個從左邊開始向右滑動,每次滑動一個單位,求出每次滑動後窗口中的最大值和最小值。

例如:

The array is [1 3 -1 -3 5 3 6 7], and k = 3.

輸入輸出格式

輸入格式:

 

輸入一共有兩行,第一行爲n,k。

第二行爲n個數(<INT_MAX).

 

輸出格式:

 

輸出共兩行,第一行爲每次窗口滑動的最小值

第二行爲每次窗口滑動的最大值

 

輸入輸出樣例

輸入樣例#1: 

8 3
1 3 -1 -3 5 3 6 7

輸出樣例#1: 

-1 -3 -3 -3 3 3
3 3 5 5 6 7

說明

50%的數據,n<=10^5

100%的數據,n<=10^6

分析

單調隊列

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
using namespace std;
int l,r,n,k,a[1000500],q[1000005];
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	scanf("%d",&a[i]);
	l=r=1;
	for(int i=1;i<=n;i++)
	{
		while(l<r&&a[q[r-1]]>a[i])
		r--;
		q[r++]=i;
		while(l<r&&q[l]<=i-k)
		l++;
		if(i>=k)
		printf("%d ",a[q[l]]);
	}
	cout<<endl;
	memset(q,0,sizeof(q));
	l=r=1;
	for(int i=1;i<=n;i++)
	{
		while(l<r&&a[q[r-1]]<a[i])
		r--;
		q[r++]=i;
		while(l<r&&q[l]<=i-k)
		l++;
		if(i>=k)
		printf("%d ",a[q[l]]);
	}
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章