Pagini recente » Cod sursa (job #2259737) | Cod sursa (job #1653950) | Cod sursa (job #664446) | Cod sursa (job #2337405) | Cod sursa (job #2914165)
#include <fstream>
#include <deque>
#define MAXN 5000000
using namespace std;
ifstream fin("deque.in");
ofstream fout("deque.out");
int v[MAXN];
int main() {
deque<int> d;
int n, k;
long long sum = 0;
fin >> n >> k;
for (int i = 1; i <= n; ++i) {
fin >> v[i];
// Cat timp elementul curent este mai mic decat ultimul element din deque, eliminam pozitia ultimului element din deque
while (!d.empty() && v[i] <= v[d.back()]) {
d.pop_back();
}
// Adaugam pozitia elementului curent in deque
d.push_back(i);
// Daca elementul minim coincide cu cel de pe pozita i-K, ii eliminam pozitia din deque, deoarece acesta nu mai conteaza pentru pasii >= i
if (d.front() == i - k) {
d.pop_front();
}
// Adaugam minimul, acesta aflandu-se in varful deque-ului
if (i >= k) {
sum += v[d.front()];
}
}
fout << sum << "\n";
return 0;
}
/*
#include <fstream>
#include <iostream>
#define MAXN 5000001
using namespace std;
ifstream fin("deque.in");
ofstream fout("deque.out");
int v[MAXN], deq[MAXN];
int main() {
int n, k, front = 1, back = 0;
long long sum = 0;
fin >> n >> k;
for (int i = 1; i <= n; i++) {
fin >> v[i];
}
for (int i = 1; i <= n; i++) {
while (front <= back && v[i] <= v[deq[back]]) {
--back;
}
deq[++back] = i;
if (deq[front] == i - k) {
++front;
}
if (i >= k) {
sum += v[deq[front]];
}
}
cout << sum << "\n";
return 0;
}
*/