题目链接 单调队列模板题,求n个数每k个连续的数的最小最大值;最大值可直接插相反数进去,取出的时候再取回即可。 poj上STL特别的慢了,语言要选C++而非G++才能勉强跑过…大致能看个做法即可。 用数组模拟STL队列直接快了一倍多…

#include<cstdio>
#include<deque>
using namespace std;
const int N=1e6+9;
typedef int ll;
typedef pair<int,ll> pil;
struct MonotoneQueue:deque<pil>
{
	void push(pil p,int k)
	{
		while(!empty()&&back().second>=p.second)pop_back();
		for(push_back(p); p.first-front().first>=k;)pop_front();
	}
} q[2];
int n,k,ans[2][N];
int main()
{
	scanf("%d%d",&n,&k);
	for(int i=0,a; i<n; ++i)
	{
		scanf("%d",&a);
		q[0].push(pil(i,a),k);
		ans[0][i]=q[0].front().second;
		q[1].push(pil(i,-a),k);
		ans[1][i]=-q[1].front().second;
	}
	for(int j=0; j<2; ++j)
		for(int i=k-1; i<n; ++i)
			printf("%d%c",ans[j][i],i+1==n?'\n':' ');
}