Cod sursa(job #2024842)

Utilizator Alex18maiAlex Enache Alex18mai Data 21 septembrie 2017 12:09:37
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 4.2 kb
#include <fstream>
#include <vector>

using namespace std;

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

long long NR[5000500];

struct node{
    int nr;
    int pos;
    int prev = -1;
    int next = -1;
};

vector <node> N;

void afis(){
    for (auto x : N){
        cout<<NR[x.nr]<<" "/*<<x.nr<<" "*/<<x.pos<<" "<<x.prev<<" "<<x.next<<'\n';
    }
}

class Deque{
    int pos_front = -1;
    int pos_back = -1;
public:
    bool empty(){
        if (pos_front == -1){
            return 1;
        }
        return 0;
    };
    void push_front(int val){
        //cout<<"pos "<<pos_back<<" "<<pos_front<<'\n';
        node now;
        N.push_back(now);
        N[N.size() - 1].nr = val;
        N[N.size() - 1].pos = N.size() - 1;
        if (pos_front != -1){
            N[N.size() - 1].prev = pos_front;
            //cout<<"unesc "<<val<<" "<<N[pos_front].nr<<'\n';
            N[pos_front].next = N.size() - 1;
            //cout<<"unesc "<<N[pos_front].nr<<" "<<N[N.size() - 1].nr <<'\n';
        }
        pos_front = N.size() - 1;
        if (pos_back == -1){
            pos_back = N.size() - 1;
            //cout<<"pula "<<back()<<'\n';
        }
    };
    void push_back(int val){
        //cout<<"pos "<<pos_back<<" "<<pos_front<<'\n';
        node now;
        N.push_back(now);
        N[N.size() - 1].nr = val;
        N[N.size() - 1].pos = N.size() - 1;
        if (pos_back != -1){
            N[N.size() - 1].next = pos_back;
            N[N[pos_back].pos].prev = N.size() - 1;
        }
        pos_back = N.size() - 1;
        if (pos_front == -1){
            pos_front = N.size() - 1;
        }
    };
    void pop_front(){
        //cout<<"pos inceput "<<pos_back<<" "<<pos_front<<'\n';
        if (pos_front == -1){
            return;
        }
        if (N[pos_front].prev != -1){
            N[N[pos_front].prev].next = -1;
            //cout<<N[N[pos_front].prev].pos<<'\n';
            int old = pos_front;
            pos_front = N[N[pos_front].prev].pos;
            N[old].prev = -1;
            N[old].next = -1;
        }
        else{
            //cout<<"front "<<front()<<'\n';
            //cout<<"back "<<back()<<'\n';
            pos_front = -1;
            pos_back = -1;
        }
        //cout<<"pos final "<<pos_back<<" "<<pos_front<<'\n';
    };
    void pop_back(){
        //cout<<"pos inceput "<<pos_back<<" "<<pos_front<<'\n';
        if (pos_back == -1){
            return;
        }
        if (N[pos_back].next != -1){
            N[N[pos_back].next].prev = -1;
            int old = pos_back;
            pos_back = N[N[pos_back].next].pos;
            N[old].next = -1;
            N[old].prev = -1;
        }
        else{
            pos_back = -1;
            pos_front = -1;
        }
        //cout<<"pos final "<<pos_back<<" "<<pos_front<<'\n';
    };
    int front(){
        if (pos_front == -1){
            return -1e9;
        }
        return N[pos_front].nr;
    };
    int back(){
        if (pos_back == -1){
            return -1e9;
        }
        return N[pos_back].nr;
    };
} D;

int main() {

    ios::sync_with_stdio(false);
    cin.tie(NULL);

    long long cont = 0;
    int n, k;
    cin>>n>>k;
    for (int i=1; i<=n; i++){
        cin>>NR[i];
    }
    for (int i=1; i<=k; i++){
        while(!D.empty() && NR[D.front()] > NR[i]){
            //cout<<"scot "<<NR[i]<<" "<<NR[D.front()]<<'\n';
            D.pop_front();
        }
        D.push_front(i);
        //cout<<"front "<<NR[D.front()]<<'\n';
        //cout<<"back "<<NR[D.back()]<<'\n';
        //afis();
        //cout<<"bag "<<i<<" "<<NR[D.front()]<<'\n';
    }
    //cout<<NR[D.back()]<<'\n';
    cont += NR[D.back()];
    for (int i=k+1; i<=n; i++){
        while(!D.empty() && NR[D.front()] > NR[i]){
            //cout<<"scot "<<NR[i]<<" "<<NR[D.front()]<<'\n';
            D.pop_front();
        }
        D.push_front(i);
        //cout<<"bag "<<i<<" "<<NR[D.front()]<<'\n';
        if (D.back() <= i - k){
            //cout<<"scot "<<NR[i]<<" "<<NR[D.back()]<<'\n';
            D.pop_back();
        }
        //cout<<NR[D.back()]<<'\n';
        cont += NR[D.back()];
        //afis();
        //cout<<"front "<<NR[D.front()]<<'\n';
        //cout<<"back "<<NR[D.back()]<<'\n';
    }
    cout/*<<'\n'*/<<cont;
    return 0;
}