Cod sursa(job #1583399)

Utilizator danalex97Dan H Alexandru danalex97 Data 28 ianuarie 2016 22:29:26
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
 
ifstream F("deque.in");
ofstream G("deque.out");
 
const int N = 5000010;

/*
template <class T>
class deque {
	private:
		struct node {
			T value;
			node *next;
			node *last;
		};
		node *_front;
		node *_back;
	
	
	public:
		deque() {
			_front = _back = nullptr;
		}
		
		void push_front(T value) {
			node *newNode = new node();
			newNode->next  = _front;
			newNode->value = value;
			if (_front != nullptr) {
				_front->last = newNode;
			}
			_front = newNode;
			if (_back == nullptr) {
				_back = _front;
			} 
		}
		
		void push_back(T value) {
			node *newNode = new node();
			newNode->last  = _back;
			newNode->value = value;
			if (_back != nullptr) {
				_back->next = newNode;
			}
			_back = newNode;
			if (_front == nullptr) {
				_front = _back;
			} 
		}
		
		T front() {
			return _front -> value;
		}
		
		T back() {
			return _back -> value;
		}
		
		void pop_front() {
			node *now = _front;
			_front = _front -> next;
			delete now;
		}
		
		void pop_back() {
			node *now = _back;
			_back = _back -> last;
			delete now;
		}
		
		bool empty() {
			return _front == _back && _front == nullptr;
		}
};*/
 
int n,k,a[N];
deque<int> dq;
long long ans;
 
int main()
{
    F>>n>>k;
    for (int i=1;i<=n;++i)
        F>>a[i];
    for (int i=1;i<=k;++i)
    {
        if ( !dq.empty() )
        {
            while ( a[i] < a[dq.back()] )
            {
                dq.pop_back();
                if ( dq.empty() ) break;
            }
        }
        dq.push_back( i );
    }
    ans += a[dq.front()];
    for (int i=k+1;i<=n;++i)
    {
        if ( !dq.empty() )
            if ( dq.front() <= i-k )
                dq.pop_front();
        if ( !dq.empty() )
        {
            while ( a[i] < a[dq.back()] )
            {
                dq.pop_back();
                if ( dq.empty() ) break;
            }
        }
        dq.push_back( i );
        ans += a[dq.front()];
    }
    G<<ans<<'\n';
}