数据结构 - 单调队列

数据结构 - 单调队列

题目链接:http://poj.org/problem?id=2823

代码:

//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 1e6 + 10;

int n, k;

int num[N], st[N];

int minn[N], maxx[N];

int main() {
	scanf("%d%d", &n, &k);
	for (int i = 1; i <= n; i ++ ) {
		scanf("%d", &num[i]);
	}
	int l = 1, r = 1;
	for (int i = 1; i <= n; i ++ ) {
		while (l <= r && i - st[l] >= k) {
			l ++ ;
		}
		while (l <= r && num[i] < num[st[r]]) {
			r -- ;
		}
		st[ ++ r] = i;
		if (i >= k) {
			minn[i] = num[st[l]];
		}
	}
	l = 1, r = 1;
	for (int i = 1; i <= n; i ++ ) {
		while (l <= r && i - st[l] >= k) {
			l ++ ;
		}
		while (l <= r && num[i] > num[st[r]]) {
			r -- ;
		}
		st[ ++ r] = i;
		if (i >= k) {
			maxx[i] = num[st[l]];
		}
	}
	for (int i = k; i <= n; i ++ ) {
		printf("%d ", minn[i]);
	}
	puts("");
	for (int i = k; i <= n; i ++ ) {
		printf("%d ", maxx[i]);
	}
	return 0;	
}
posted @ 2019-11-15 08:01  筱柒_Littleseven  阅读(78)  评论(0编辑  收藏  举报