首页 > Windows开发 > 详细

POJ 2823 Sliding Window (单调队列)

时间:2014-02-18 01:07:50      阅读:490      评论:0      收藏:0      [点我收藏+]

http://poj.org/problem?id=2823


注意G++会TLE。

用pair<int,int>数组模拟deque即可


完整代码:

/*5360ms,19272KB*/

#include<cstdio>
#include<cstring>
#include<utility>
using namespace std;
const int mx = 1000005;

pair<int, int> minq[mx], maxq[mx]; /// first表示值,second表示该值在原序列的位置
int maxans[mx];
int minhead, mintail, maxhead, maxtail;

void push(int x, int i)
{
	/// minq.push(x)
	if (mintail != minhead)
		while (mintail != minhead && x <= minq[mintail].first) --mintail;
	minq[++mintail] = make_pair(x, i);
	/// maxq.push(x)
	if (maxtail != maxhead)
		while (maxtail != maxhead && x >= maxq[maxtail].first) --maxtail;
	maxq[++maxtail] = make_pair(x, i);
}

int main()
{
	int n, k, i, j = 1, x, cnt = 0;
	scanf("%d%d", &n, &k);
	for (i = 0; i < k; ++i)
	{
		scanf("%d", &x);
		push(x, i);
	}
	printf("%d", minq[minhead + 1].second == 0 ? minq[++minhead].first : minq[minhead + 1].first);
	maxans[cnt++] = (maxq[maxhead + 1].second == 0 ? maxq[++maxhead].first : maxq[maxhead + 1].first);
	for (; i < n; ++i, ++j)
	{
		scanf("%d", &x);
		push(x, i);
		printf(" %d", minq[minhead + 1].second == j ? minq[++minhead].first : minq[minhead + 1].first);
		maxans[cnt++] = (maxq[maxhead + 1].second == j ? maxq[++maxhead].first : maxq[maxhead + 1].first);
	}
	printf("\n%d", maxans[0]);
	for (i = 1; i < cnt; ++i) printf(" %d", maxans[i]);
	putchar(10);
	return 0;
}

POJ 2823 Sliding Window (单调队列)

原文:http://blog.csdn.net/synapse7/article/details/19334149

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!