POJ 2823 Sliding Window (单调队列)

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;
}

你可能感兴趣的:(C++,ACM,poj,双端队列)