Cod sursa(job #2610324)

Utilizator nicu_ducalNicu Ducal nicu_ducal Data 4 mai 2020 18:55:17
Problema Deque Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.37 kb
/******** Ordered Set ********
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; */

#include <bits/stdc++.h>
#define debug(x) cerr << #x << " = " << x << "\n"
#define all(x) (x).begin(),(x).end()
#define len length()
#define sz size()
#define pb push_back
#define fi first
#define se second
#define pii pair<int,int>
#define pll pair<ll,ll>

using ull = unsigned long long;
using ll = long long;
using namespace std;

const int INF = INT_MAX;
ll t, n, k, num, ans;

struct Node{
    int value;
    Node* Left;
    Node* Right;

    Node(int _value, Node* _Left = nullptr, Node* _Right = nullptr) : value(_value), Left(_Left), Right(_Right) {}
    ~Node() {
        value = 0;
        Left = nullptr;
        Right = nullptr;
    }
};

class Deque{
    private:
        Node* Front;
        Node* Back;
        int Size;
    public:
        Deque() : Front(nullptr), Back(nullptr), Size(0) {}

        void Pop_front(){
            Node* toPop = Front;
            if (Size == 1){
                Front = nullptr, Back = nullptr;
            } else {
                Front = Front->Right;
                Front->Left = nullptr;
            }
            delete toPop;
            --Size;
        }
        void Pop_back(){
            Node* toPop = Back;
            if (Size == 1){
                Front = nullptr, Back = nullptr;
            } else {
                Back = Back->Left;
                Back->Right = nullptr;
            }
            delete toPop;
            --Size;
        }
        void Push_front(int val){
            Node* newNode = new Node(val);
            if (Size == 0){
                Front = newNode;
                Back = newNode;
            } else {
                Front->Left = newNode;
                newNode->Right = Front;
                Front = newNode;
            }
            ++Size;
        }
        void Push_back(int val){
            Node* newNode = new Node(val);
            if (Size == 0){
                Front = newNode;
                Back = newNode;
            } else {
                Back->Right = newNode;
                newNode->Left = Back;
                Back = newNode;
            }
            ++Size;
        }
        int getFront(){
            if (Size > 0)
                return Front->value;
            return 0;
        }
        int getBack(){
            if (Size > 0)
                return Back->value;
            return 0;
        }
        bool Empty(){
            if (Size > 0)
                return 0;
            return 1;
        }
};

int main(){
    ios_base::sync_with_stdio(0); cin.tie(); cout.tie();
    ifstream cin("deque.in");
    ofstream cout("deque.out");

    Deque deq, idx;
    cin >> n >> k;
    for (int i = 1; i <= n; i++){
        cin >> num;
        while (!idx.Empty() and i - idx.getFront() >= k){
            idx.Pop_front();
            deq.Pop_front();
        }
        while (!deq.Empty() and deq.getBack() >= num){
            deq.Pop_back();
            idx.Pop_back();
        }
        deq.Push_back(num);
        idx.Push_back(i);
        if (i >= k) ans += deq.getFront();
    }

    //cout << deq.getBack() << " ";
    cout << ans;
    return 0;
}