Cod sursa(job #2370213)

Utilizator AplayLazar Laurentiu Aplay Data 6 martie 2019 11:11:02
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <cstdio>
#include <queue>

#define DEBUG 0

#define N_MAX 5000001

int N, k, n[N_MAX];
long long answer = 0;
std::deque<std::pair<int, int> > dq;

void dqInsert(int value, int position) {
    while (!dq.empty() && value <= dq.back().first) dq.pop_back();
    dq.push_back(std::make_pair(value, position));
}

int dqMin(int limit) {
    while (dq.front().second < limit) dq.pop_front();
    return dq.front().first;
}

int main() {
    freopen("deque.in", "r", stdin);
    freopen("deque.out", "w", stdout);

    scanf("%d%d", &N, &k);
    for (int it = 0; it < N; ++it) {
        scanf("%d", &n[it]);
        if (it < k) {
            dqInsert(n[it], it);
        }
    }

    answer += dqMin(0);
    if (DEBUG) printf("%d\n", dqMin(0));
    if (DEBUG) {
        for (int it = 0; it < dq.size(); ++it) printf("%d ", dq[it].first);
        printf("\n");
    }
    for (int it = k; it < N; ++it) {
        dqInsert(n[it], it);
        answer += dqMin(it - k + 1);
        if (DEBUG) printf("%d\n", dqMin(it - k + 1));
        if (DEBUG) {
            for (int it = 0; it < dq.size(); ++it) printf("%d ", dq[it].first);
            printf("\n");
        }
    }
    
    if (DEBUG) printf("\n");
    printf("%lld\n", answer);

    return 0;
}