Cod sursa(job #806438)

Utilizator irene_mFMI Irina Iancu irene_m Data 2 noiembrie 2012 19:55:39
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>

using namespace std;

using namespace std;

class Node {
    private:
        int value, index;
    public:
        Node() {}
        Node(int value, int index) { this->value = value; this->index = index; }
        Node(const Node &newNode) { this->value = newNode.value; this->index = newNode.index; }
        int getValue() { return value; }
        int getIndex() { return index; }
} ;

class Deque {
    private:
        Node *array;
        int capacity;
        int left, right;
    public:
        Deque(int);
        void push(Node current) { array[++right] = current; }
        void pop_back() { right--; }
        void pop_front() { left++; }
        Node min() { return array[left]; }
        int size() { return right - left + 1; }
        Node top() { return array[right]; }
} ;

Deque::Deque(int n) {
    capacity = n;
    array = new Node[capacity + 5];
    left = 1;
    right = 0;
}

int main()
{
    ifstream fin("deque.in");
    ofstream fout("deque.out");
    int N, K, value;
    long long sum;
    fin >> N >> K;
    Deque deque(N);
    for(int i = 1; i <= K; ++i) {
        fin >> value;
        while(deque.size() > 0 && deque.top().getValue() > value)
            deque.pop_back();
        deque.push(Node(value, i));
    }

    sum = deque.min().getValue();
    for(int i = K + 1; i <= N; ++i) {
        fin >> value;
        while(deque.size() > 0 && deque.top().getValue() > value)
            deque.pop_back();
        deque.push(Node(value, i));
        while(deque.min().getIndex() <= i - K)
            deque.pop_front();
        sum += deque.min().getValue();
    }

    fout << sum << "\n";
    fin.close();
    fout.close();
    return 0;
}