Cod sursa(job #2249529)

Utilizator cosmin.pascaruPascaru Cosmin cosmin.pascaru Data 30 septembrie 2018 01:07:03
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <array>
#include <algorithm>
#include <vector>
#include <stack>
#include <set>
#include <assert.h>
#include <queue>
#include <chrono>
#include <cstring>
#include <memory>
#include <queue>
#include <deque>
 
using LL = long long;
using ULL = int long long;
 
const std::string _problemName = "deque";
 
namespace std {
std::ifstream fin(_problemName + ".in");
std::ofstream fout(_problemName + ".out");
}
 
#define USE_FILES
 
#ifdef USE_FILES
#define cin fin
#define cout fout
#endif

struct Element {
    int value;
    int position;

    Element(int value, int position) {
        this->value = value;
        this->position = position;
    }
};

void add(std::deque<Element>& deque, int element, int index) {
    while (!deque.empty() && deque.back().value >= element) {
        deque.pop_back();
    }
    deque.emplace_back(element, index);
}

int getMin(const std::deque<Element>& deque) {
    return deque.front().value;
}

void removeOlderThan(std::deque<Element>& deque, int removeBefore) {
    if (!deque.empty() && deque.front().position <= removeBefore) {
        deque.pop_front();
    }
}

LL computeSubsequenceMinimumsSum(const std::vector<int>& vector, int subsequenceLength) {
    std::deque<Element> deque;

    for (int idx = 0; idx < subsequenceLength; ++idx) {
        add(deque, vector[idx], idx);
    }

    LL sum = getMin(deque);

    for(int idx = subsequenceLength; idx < (int) vector.size(); ++idx) {
        removeOlderThan(deque, idx - subsequenceLength);
        add(deque, vector[idx], idx);

        sum += getMin(deque);
    }

    return sum;
}

int main() {

    int n, k;
    std::cin >> n >> k;

    std::vector<int> v(n);

    for (auto& it : v) {
        std::cin >> it;
    }

    std::cout << computeSubsequenceMinimumsSum(v, k) << '\n';

    return 0;
}