比赛 至少完成十道练习 评测结果 AAAAAAAAA
题目名称 滑动窗口 最终得分 100
用户昵称 Mealy 运行时间 1.580 s
代码语言 C++ 内存使用 65.17 MiB
提交时间 2017-05-22 19:19:16
显示代码纯文本
//495
#include <iostream>
#include <cstdio>
#define u ree[tmpx]
#define lc ree[tmpx<<1]
#define rc ree[tmpx<<1^1]
using namespace std;
const int nmax=1000086;
typedef long long ll;

int n,k;
int val[nmax];
class SegmentTree{
public:
	int l,r;
	int min,max;
}ree[nmax*4];
int GetMax(int a,int b){
	if(a>b) return a;
	else return b;
}
int GetMin(int a,int b){
	if(a<b) return a;
	else return b;
}

void SetTree(int tmpx,int tmpl,int tmpr){
	u.l = tmpl;
	u.r = tmpr;
	if(tmpl == tmpr){
		u.max = val[tmpl];
		u.min = val[tmpl];
	}
	else{
		SetTree(tmpx<<1,tmpl,(tmpl+tmpr)>>1);
		SetTree(tmpx<<1^1,((tmpl+tmpr)>>1)+1,tmpr);
		u.max = GetMax(lc.max,rc.max);
		u.min = GetMin(lc.min,rc.min);
	}
}

int QueryMax(int tmpx,int tmpl,int tmpr){
	if((tmpl <= u.l)&&(tmpr >= u.r))
		return u.max;
	else{
		if(u.r != u.l){
			int maxl=0,maxr=0;
			if(tmpl <= lc.r)
				maxl=QueryMax(tmpx<<1,tmpl,tmpr);
			if(tmpr >= rc.l)
				maxr=QueryMax(tmpx<<1^1,tmpl,tmpr);
			return GetMax(maxl,maxr);
		}
	}
}
int QueryMin(int tmpx,int tmpl,int tmpr){
	if((tmpl <= u.l)&&(tmpr>=u.r)){
		return u.min;
	}
	else{
		if(u.r!=u.l){
			int minl=nmax,minr=nmax;
			if(tmpl<=lc.r)
				minl=QueryMin(tmpx<<1,tmpl,tmpr);
			if(tmpr>=rc.l)
				minr=QueryMin(tmpx<<1^1,tmpl,tmpr);
			return GetMin(minl,minr);
		}
	}
}
int main(){
	freopen("window.in","r",stdin);
	freopen("window.out","w",stdout);
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
		scanf("%d",&val[i]);
	SetTree(1,-1,n);
	for(int i=1;i<=n-k+1;i++)
		printf("%d ",QueryMin(1,i,i+k-1));
	printf("\n");
	for(int i=1;i<=n-k+1;i++)
		printf("%d ",QueryMax(1,i,i+k-1));
	printf("\n");
	return 0;
}