Cod sursa(job #1105011)

Utilizator cdt2014Cont de Teste cdt2014 Data 11 februarie 2014 12:52:53
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <iostream>
#include <fstream>
#include <deque>
#include <vector>
using namespace std;

class SumOfMinimums {
	public:
		SumOfMinimums(vector<int>& V, int K) {
			sum = 0;

			for (int i=0; i<K-1; ++i) {
				push(V[i], i);
			}

			for (int i=K-1; i<V.size(); ++i) {
				pop(i-K+1);
				push(V[i], i);

				sum += Q.front().second;
			}
		}

		long long get() { return sum; }
	private:
		deque< pair<int, int> > Q;
		long long sum;

		void push(int val, int pos) {
			while (!Q.empty() && val <= Q.back().second) {
				Q.pop_back();
			}
			Q.push_back(make_pair(pos, val));
		}

		void pop(int thresh) {
			while (!Q.empty() && Q.front().first < thresh) {
				Q.pop_front();
			}
		}
};

int main() {
	ifstream in("deque.in");
	ofstream out("deque.out");
	int N, K;
	vector<int> values;

	in >> N >> K;
	while (N--) {
		int x;
		in >> x;
		values.push_back(x);
	}

	SumOfMinimums som(values, K);
	out << som.get() << "\n";
	return 0;
}