记录编号 168131 评测结果 AAAAAAAAA
题目名称 [POJ 2823]滑动窗口 最终得分 100
用户昵称 Gravatarqqq 是否通过 通过
代码语言 C++ 运行时间 0.555 s
提交时间 2015-07-01 15:25:19 内存使用 23.18 MiB
显示代码纯文本
#define MAXN 1000010UL
 
#include <cstdio>
 
using namespace std;
 
struct Deq{
    int data[MAXN],tail,head,id[MAXN];
    inline void clr(){
        tail=-1;
        head=0;
        return;
    }
    inline bool empty(){
        return tail<head;
    }
    inline void pop_front(){
        if(!empty()){
            head++;
        }
        return;
    }
    inline void push_back(int temp,int new_id){
        data[++tail]=temp;
        id[tail]=new_id;
        return;
    }
    inline void pop_back(){
        tail--;
        return;
    }
    inline int front(){
        return data[head];
    }
    inline int front_id(){
        return id[head];
    }  
    inline int back(){
        return data[tail];
    }
    inline void push_up(int temp,int new_id){
        while(!empty()&&back()>temp){
            pop_back();
        }
        push_back(temp,new_id);
        return;
    }
    inline void push_down(int temp,int new_id){
        while(!empty()&&back()<temp){
            pop_back();
        }
        push_back(temp,new_id);
        return;
    }
};
 
Deq deq_max,deq_min;
 
int Max[MAXN],Min[MAXN],n,length,temp,cs;
 
inline int in();
 
int main(){
    freopen("window.in","r",stdin);
    freopen("window.out","w",stdout);
    n=in();length=in();
    deq_max.clr();deq_min.clr();
    for(int i=1;i<=n;i++){
        temp=in();
        deq_max.push_down(temp,i);
        deq_min.push_up(temp,i);
        if(i==length){
            cs++;
            Max[cs]=deq_max.front();
            Min[cs]=deq_min.front();
            continue;
        }
        if(i>length){
            if(deq_max.front_id()==i-length){
                deq_max.pop_front();
            }
            if(deq_min.front_id()==i-length){
                deq_min.pop_front();
            }          
            cs++;
            Max[cs]=deq_max.front();
            Min[cs]=deq_min.front();   
        }
    }
    printf("%d",Min[1]);
    for(int i=2;i<=cs;i++){
        printf(" %d",Min[i]);
    }
    printf("\n");
    printf("%d",Max[1]);
    for(int i=2;i<=cs;i++){
        printf(" %d",Max[i]);
    }  
    //fclose(stdin);
    //fclose(stdout);  
    return 0;
}
 
inline int in(){
    int temp=0;bool flag=0;char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-') flag=1;
        c=getchar();
    }
    for(;c>='0'&&c<='9';c=getchar()){
        temp=temp*10+c-48;
    }
    if(flag) return -temp;
    return temp;
}