Pagini recente » Cod sursa (job #2533423) | Cod sursa (job #939796) | Cod sursa (job #3256941) | Cod sursa (job #1020417) | Cod sursa (job #1553001)
#include <fstream>
#include <iostream>
using namespace std;
const int MAX = 5000005;
int V[MAX];
struct Deque {
int val;
Deque* next;
Deque* before;
Deque(int val) {
this->val = val;
this->next = nullptr;
this->before = nullptr;
}
};
long long getMin(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[tail->val] > input[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[head->val];
}
}
return min;
}
int main() {
ifstream f("deque.in");
ofstream g("deque.out");
int numOfElem;
int range;
f >> numOfElem >> range;
for (int i = 0; i < numOfElem; i++) {
f >> V[i];
}
g << getMin(V, numOfElem, range);
f.close();
g.close();
return 0;
}