记录编号 306980 评测结果 WWAWAAWWW
题目名称 [POJ 2823]滑动窗口 最终得分 33
用户昵称 GravatarAntiLeaf 是否通过 未通过
代码语言 C++ 运行时间 1.388 s
提交时间 2016-09-13 16:17:16 内存使用 7.94 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<functional>
#include<deque>
using namespace std;
const int maxn=1000010;
template<typename T,class compare=less<T>,class base=std::deque<pair<T,int> > >
struct boring_queue{
	base q;
	int cnt;
	compare cmp;
	boring_queue():q(base()),cnt(0),cmp(compare()){}
	void clear(){
		*this=base();
		cnt=0;
	}
	void push(const T &x){
		while(!q.empty()&&!cmp(q.back().first,x))q.pop_back();
		q.push_back(make_pair(x,++cnt));
	}
	void refresh(int x){
		while(!q.empty()&&q.front().second<=x)q.pop_front();
	}
	bool empty()const{
		return q.empty();
	}
	T &front(){
		return q.front().first;
	}
	T &back(){
		return q.back().first;
	}
};//默认维护一个单调增的单调队列
boring_queue<int>qmin;
boring_queue<int,greater<int> >qmax;
int n,m,x,a[maxn],b[maxn];
int main(){
#define MINE
#ifdef MINE
	freopen("window.in","r",stdin);
	freopen("window.out","w",stdout);
#endif
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
		qmin.push(x);
		qmax.push(x);
		if(i>=m){
			a[i]=qmin.front();
			b[i]=qmax.front();
		}
		qmin.refresh(i-m);
		qmax.refresh(i-m);
	}
	for(int i=m;i<=n;i++)printf("%d ",a[i]);
	printf("\n");
	for(int i=m;i<=n;i++)printf("%d ",b[i]);
#ifndef MINE
	printf("\n--------------------DONE--------------------\n");
	for(;;);
#endif
	return 0;
}