Cod sursa(job #1552997)

Utilizator geni950814Geni Geni geni950814 Data 19 decembrie 2015 00:18:05
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

struct Deque {
	int val;
	Deque* next;
	Deque* before;

	Deque(int val) {
		this->val = val;
		this->next = nullptr;
		this->before = nullptr;
	}
};

long long getMin(vector<int> input, int numOfElem, int range) {
	long long min = 0;
	Deque* head = new Deque(0);
	Deque* tail = head;
	for(int i = 1; i < numOfElem; i++) {
		if(head->val <= i - range) {
			Deque* newHead = head->next;
			delete head;	
			head = newHead;
			head->before = nullptr;
		}
		while(tail != nullptr && input.at(tail->val) > input.at(i)) {
			Deque* newTail = tail->before;
			delete tail;	
			tail = newTail;
		}
		if(tail == nullptr) {
			head = new Deque(i);
			tail = head;
		} else {			
			Deque* newTail = new Deque(i);
			newTail->before = tail;
			tail->next = newTail;
			tail = newTail;
		}	
		if(i >= range - 1) {
			min += input.at(head->val);
		}
	}
	return min;
}

int main() {
	ifstream f("deque.in");
	ofstream g("deque.out");

	int numOfElem;
	int range;
	
	f >> numOfElem;
	f >> range;
	
	int elem;
	vector<int> input;

	while(f >> elem) {
		input.push_back(elem);
	}
	
	g << getMin(input, numOfElem, range);
	f.close();
	g.close();
	return 0;
}