#include<cstdio>
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int a[N];
int xiao[N];//存储的是下标 
int l = 0,r = 0;
int main(){
    int n , k;
    scanf("%d %d" , &n , &k);
    //先接收好元素 
    for(int i = 0 ; i < n ; i ++){
    	scanf("%d" , &a[i]);
	}

	//求最小值
	//维护好一个单调递增的队列,永远保证队列是单调递增
	//(左侧是最小的,右侧是最大的,并且右侧是当前滑动窗口的最右侧元素 
	for(int i = 0; i < n ; i ++){
		//判断队头是否出窗口了 
		if(l <= r && xiao[l] < i - k + 1)
			l ++;
		//维护单调队列 
		while(l <= r && a[i] <= a[xiao[r]]) 
			r--;
		
		xiao[++r] = i;//将当前元素的下表插入到队列的最后 

		if(i >= k - 1){//从第k个开始才需要开始打印
			printf("%d " , a[xiao[l]]);//队列的第一个元素就是当前滑动窗口的最小值 
		}
	}

	cout << endl;
	l = r = 0;
	//求最小值
	//维护好一个单调递增的队列,永远保证队列是单调递增
	//(左侧是最小的,右侧是最大的,并且右侧是当前滑动窗口的最右侧元素 
	for(int i = 0; i < n ; i ++){
		//判断队头是否出窗口了 
		if(l <= r && xiao[l] < i - k + 1)
			l ++;
		//维护单调队列 
		while(l <= r && a[i] >= a[xiao[r]]) 
			r--;
		
		xiao[++r] = i;//将当前元素的下表插入到队列的最后 

		if(i >= k - 1){//从第k个开始才需要开始打印
			printf("%d " , a[xiao[l]]);//队列的第一个元素就是当前滑动窗口的最小值 
		}
	}
	return 0;
}

0 条评论

目前还没有评论...