比赛 |
至少完成十道练习 |
评测结果 |
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;
}