Cod sursa(job #2730761)

Utilizator EckchartZgarcea Robert-Andrei Eckchart Data 26 martie 2021 20:01:27
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include "bits/stdc++.h"
#include <cassert>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using pi = pair<int, int>;
using pll = pair<ll, ll>;
using pd = pair<double, double>;
using pld = pair<ld, ld>;


int main()
{
    ifstream cin("deque.in");
    ofstream cout("deque.out");

    int N, K;
    cin >> N >> K;

    deque<pi> nrs;

    auto get_min = [&]() -> pi
    {
        return nrs.front();
    };

    auto add_elem = [&](const int val, const int idx) -> void
    {
        while (!nrs.empty() && val <= nrs.back().first)
        {
            nrs.pop_back();
        }
        nrs.emplace_back(val, idx);
    };
    
    auto del_elem = [&](const int iteration_idx) -> void
    {
        if (nrs.front().second == iteration_idx - K)
        {
            nrs.pop_front();
        }
    };
    
    int cur_idx;
    for (cur_idx = 0; cur_idx < K - 1; ++cur_idx)
    {
        int cur_nr;
        cin >> cur_nr;

        add_elem(cur_nr, cur_idx);
    }

    ll res{};
    for (int cur_nr; cur_idx < N; ++cur_idx)
    {
        cin >> cur_nr;
        /*cerr << "deque: ";
        for (const auto &q : nrs)
        {
            printf("{%d, %d}, ", q.first, q.second);
        }
        cerr << endl;*/
        add_elem(cur_nr, cur_idx);
        del_elem(cur_idx);
        res += get_min().first;
    }

    cout << res;
}