2021.07.22暑假集训(滑动窗口)

 

1.滑动窗口 (nowcoder.com)

 deque容器为一个给定类型的元素进行线性处理,像向量一样,它能够快速地随机访问任一个元素,并且能够高效地插入和删除容器的尾部元素。但它又与vector不同,deque支持高效插入和删除容器的头部元素,因此也叫做双端队列

deque<int>big,sml;
int n,k,num[maxn];

int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>num[i];
    for(int i=1;i<=n;i++){
        while(!big.empty()&&num[big.front()]>num[i]) big.pop_front();
        big.push_front(i);
        if(big.back()<=i-k) big.pop_back();
        if(i>=k) cout<<num[big.back()]<<" ";
    }
    cout<<endl;
    for(int i=1;i<=n;i++){//这个单调是从左往右 增加的
        while(!sml.empty()&&num[sml.front()]<num[i]) sml.pop_front();//如果比队首还大 那么就直接替换队首元素 队首元素没有机会了
        sml.push_front(i);     //不管什么都插入i这个数
        if(sml.back()<=i-k) sml.pop_back();    //如果超过k这个范围了   就直接出栈
        if(i>=k) cout<<num[sml.back()]<<" ";      
    }
    return 0;
}

 

posted @ 2021-07-22 16:32  bonel  阅读(37)  评论(0)    收藏  举报