compro-library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub ningenMe/compro-library

:heavy_check_mark: test/static-range-query/SlideMost.test.cpp

Depends on

Code

#define PROBLEM "http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_3_D"

#include <vector>
#include <iostream>
#include <deque>
using namespace std;
#include "../../lib/13-static-range-query/SlideMost.cpp"

int main(void){
    cin.tie(0);ios::sync_with_stdio(false);
    int N,L; cin >> N >> L;
    vector<int> A(N);
    for(int i=0;i<N;++i) cin >> A[i];
    SlideMost<ValueMin<int>> sld;
    auto B = sld.window(A,L);
    for(int i=L-1;i<N;++i) cout << B[i] << " \n"[i==N-1];
    return 0;
}
#line 1 "test/static-range-query/SlideMost.test.cpp"
#define PROBLEM "http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_3_D"

#include <vector>
#include <iostream>
#include <deque>
using namespace std;
#line 1 "lib/13-static-range-query/SlideMost.cpp"
/*
 * @title SlideMost - スライド最小値/最大値
 * @docs md/static-range-query/SlideMost.md
 */
template<class Operator> class SlideMost {
    using TypeValue = typename Operator::TypeValue;
public:
    SlideMost(void){
    }
    vector<TypeValue> window(vector<TypeValue>& vec, const int& width){
        vector<TypeValue> res(vec.size());
        deque<TypeValue> deq;
        for(int i = 0; i < vec.size(); ++i) {
            while(deq.size() && Operator::func_compare(vec[deq.back()],vec[i]) ) deq.pop_back();
            deq.push_back(i);
            res[i] = vec[deq.front()];
            if(i+1>=width && deq.front()==i+1-width) deq.pop_front();
        }
        return res;
    }
};
//最小値クエリ
template<class T> struct ValueMin {
    using TypeValue = T;
    inline static constexpr bool func_compare(TypeValue l,TypeValue r){return l>=r;}
};
//最大値クエリ
template<class T> struct ValueMax {
    using TypeValue = T;
    inline static constexpr bool func_compare(TypeValue l,TypeValue r){return l<=r;}
};
#line 8 "test/static-range-query/SlideMost.test.cpp"

int main(void){
    cin.tie(0);ios::sync_with_stdio(false);
    int N,L; cin >> N >> L;
    vector<int> A(N);
    for(int i=0;i<N;++i) cin >> A[i];
    SlideMost<ValueMin<int>> sld;
    auto B = sld.window(A,L);
    for(int i=L-1;i<N;++i) cout << B[i] << " \n"[i==N-1];
    return 0;
}
Back to top page