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