Cod sursa(job #2906780)

Utilizator redstonegamer22Andrei Ion redstonegamer22 Data 27 mai 2022 14:21:55
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <bits/stdc++.h>

using namespace std;

#ifndef LOCAL

ifstream in("deque.in");
ofstream out("deque.out");

#define cin in
#define cout out

#endif // LOCAL

template < const int NMAX, typename DATA >
struct rotdq {
    static const int sub1 = NMAX - 1;

    DATA data[NMAX];
    int bp, ep; // first, next-after-last pointers

    rotdq() {
        // Make sure NMAX is a power of 2
        static_assert((NMAX & (NMAX - 1)) == 0);

        const int MAXROT = 4; // maximum number of times the data vector can be filled

        bp = MAXROT * NMAX; ep = MAXROT * NMAX;
    }

    int size() {
        return ep - bp;
    }

    DATA back() { return data[(ep - 1) & sub1]; }
    void push_back(const DATA& d) { data[(ep++) & sub1] = d; }
    DATA pop_back() { return data[(--ep) & sub1]; }

    DATA front() { return data[bp & sub1]; }
    void push_front(const DATA& d) { data[(--bp) & sub1] = d; }
    DATA pop_front() { return data[(bp++) & sub1]; }
};

struct MinDeque {
    int* indexer = nullptr;
    rotdq<(1 << 23), int> dq;

    void bind(int* _ind) { indexer = _ind; }

    void add_by_pop(int ind) {
        while(dq.size() > 0 && indexer[dq.back()] > indexer[ind])
            dq.pop_back();
        dq.push_back(ind);
    }

    void remove(int ind) {
        if(dq.front() == ind) dq.pop_front();
    }

    int get_min_ind() { return dq.front(); }
    int get_min() { return indexer[dq.front()]; }
} mdq;

const int NMAX = 5e6 + 7;
int vals[NMAX];

int main() {
    mdq.bind(vals);

    int n, k; cin >> n >> k;
    for(int i = 0; i < n; i++) cin >> vals[i];

    int64_t ans = 0;
    for(int i = 0; i < n; i++) {
        mdq.add_by_pop(i);

        if(i - k >= 0) mdq.remove(i - k);
        if(i >= k - 1) ans = ans + mdq.get_min();
    }

    cout << ans << endl;
    return 0;
}