单调队列

/*
维护的是前k个中最大的数和它的下标
最大数为front();
*/
class Deque{
public:
    deque<int>a;
    deque<int>id;
    int k;
    bool empty(){
        return a.empty();
    }
     void pop(int i){//弹首
         while(!id.empty()&&id.front()+k<i){//越界了就弹出
             a.pop_front();
             id.pop_front();
         }
     }
    void push(int x,int i){// x 数 i 下标
        while(!a.empty()&&a.back()<x){
            a.pop_back();id.pop_back();
        }
        a.push_back(x);
        id.push_back(i);
        pop(i);
    }
};

原文地址:https://www.cnblogs.com/yesuweiYYYY/p/13973889.html