Cod sursa(job #2000241)

Utilizator MaligMamaliga cu smantana Malig Data 13 iulie 2017 10:29:51
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.67 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream in("deque.in");
ofstream out("deque.out");
const int NMax = 5e6 + 5;

struct elem {
    int val,idx;
    elem(int _val = 0,int _idx = 0) {
        val = _val;
        idx = _idx;
    }
};

struct elemCoada {
    elem e;
    elemCoada *prv,*nxt;
    elemCoada() {
        e = elem();
        prv = 0;
        nxt = 0;
    }
};

struct deq {
    int sz;
    elemCoada *st,*dr;

    deq() {
        sz = 0;
        st = dr = 0;
    }

    void pushFront(elem e) {
        ++sz;
        if (sz == 1) {
            st = new elemCoada();
            st -> e = e;
            dr = st;

            return;
        }

        elemCoada *n = new elemCoada();
        n -> e = e;
        n -> nxt = st;

        st -> prv = n;
        st = n;
    }

    elem fata() {
        if (sz == 0) {
            return -1;
        }

        return st -> e;
    }

    void popFront() {
        if (sz == 0) {
            return;
        }
        if (sz == 1) {
            popSingle();
            return;
        }
        --sz;

        elemCoada *n = st -> nxt;
        delete st;
        st = n;
        st -> prv = 0;
    }

    void pushBack(elem e) {
        ++sz;
        if (sz == 1) {
            st = new elemCoada();
            st -> e = e;
            dr = st;

            return;
        }

        elemCoada *n = new elemCoada();
        n -> e = e;
        n -> prv = dr;

        dr -> nxt = n;
        dr = n;
    }

    elem spate() {
        if (sz == 0) {
            return -1;
        }

        return dr -> e;
    }

    void popBack() {
        if (sz == 0) {
            return;
        }
        if (sz == 1) {
            popSingle();
            return;
        }
        --sz;

        elemCoada *n = dr -> prv;
        delete dr;
        dr = n;
        dr -> nxt = 0;
    }

    void popSingle() {
        sz = 0;
        delete st;
        st = 0;
        dr = 0;
    }
}Q;

int N,K;

int main()
{
    in>>N>>K;
    for (int i=1;i < K;++i) {
        int val;
        in>>val;

        while (Q.sz && Q.spate().val >= val) {
            Q.popBack();
        }
        Q.pushBack(elem(val,i));
    }

    long long ans = 0;
    for (int i=K;i <= N;++i) {
        int val;
        in>>val;

        while (Q.sz && Q.spate().val >= val) {
            Q.popBack();
        }
        Q.pushBack(elem(val,i));

        if (Q.fata().idx <= i-K) {
            Q.popFront();
        }

        ans += Q.fata().val;
    }

    out<<ans<<'\n';

    in.close();
    out.close();
    return 0;
}