• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
james1207

博客园    首页    新随笔    联系   管理    订阅  订阅

POJ 2823 UESTCoj 1221 Sliding Window 单调队列 经典入门题

题意:给出一个序列,求出每连续k个数字中最大的数和最小的数。

这是道单调队列裸题,直接写就行了。

本来用deque写出来后,发现在poj上硬是超时了,在discuss上看很多人也在抱怨超时的问题,据说在uestc上也有这题,我过去提交终于过了。。。

但是poj还是没有过,于是我用数组模拟队列来写,提交还是超时,折腾了一会,把g++改成c++终于5s多过了。。。

注意如果是直接输出答案的话,如果k=1可能会出错。

代码:

 

#include <cstdio>
#include <cstring>
#include <deque>
using namespace std;

const int MAXN = 1000005;
int n, k, t, arr[MAXN], que[MAXN];

void solve(bool flag) {
	int head(0), rear(0);
	memset(que, 0, sizeof(que));
	if (k == 1) printf("%d ", arr[0]);
	for (int i = 1; i < n; i++) {
		if (flag) while (head <= rear && arr[i] > arr[que[rear]])
			rear--;
		else while (head <= rear && arr[i] < arr[que[rear]])
			rear--;
		que[++rear] = i;
		if (que[head] < i - k + 1) head++;
		if (i >= k - 1)
			if (i == n - 1) printf("%d\n", arr[que[head]]);
			else printf("%d ", arr[que[head]]);
	}
}

int main() {
	while (scanf("%d%d", &n, &k) != EOF) {
		for (int i = 0; i < n; i++)
			scanf("%d", &arr[i]);
		solve(0);
		solve(1);
	}
	return 0;
}


 

 

posted @ 2013-10-14 10:32  Class Xman  阅读(172)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3