スライド最小値

概要

  • 問題
  • 数列Aに対して,長さがLの区間の最小値を求める.

ソースコード

セグ木でも$O(N\log N)$で殴れるが,この手法では$O(N)$で解ける.

template<class T>
vector<T> SlidingMinimumElement(vector<T>&A,int k){
    int n=A.size();
    vector<T>res(n-k+1);
    deque<int>deq;
    for(int i=0;i<n;i++){
        while(!deq.empty()&&A[deq.back()]>A[i])deq.pop_back();
        deq.push_back(i);
        if(i-k+1>=0){
            res[i-k+1]=A[deq.front()];
            if(deq.front()==i-k+1)deq.pop_front();
        }
    }
    return res;
}