Pagini recente » Cod sursa (job #328476) | Cod sursa (job #1239508) | Cod sursa (job #198705) | Cod sursa (job #2306969) | Cod sursa (job #2630596)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("deque.in");
ofstream fout("deque.out");
int n, i, v[5000001], k;
long long s;
deque<int> deq;
/// in mare ideea este urmatoarea, desi imi e greu sa o explic in cuvinte:
/// intr-un deque am salvat pozitia minimului dintr-o subsecventa de k elemente
/// iar apoi comparam al k + 1 - lea element cu cel mai mic element din "seria" trecuta de k elemente
/// daca minimul dintre acele element e fix primul element din acel subsir de k elemente(deci nu face parte din acelasi subsir cu k + 1)
/// ii eliminam pozitia din deque
int main() {
fin >> n >> k;
for(i = 1; i <= k; i++) {
fin >> v[i];
while(!deq.empty() && v[i] <= v[deq.back()]) {
deq.pop_back();
}
deq.push_back(i);
} ///punem in deque prima pozitie a minimului primelor k elemente
s = v[deq.front()];
for(i = k + 1; i <= n; i++) {
fin >> v[i];
while(!deq.empty() && v[i] <= v[deq.back()])
///cat timp elemnetul curent e mai mic decat ultimul element al carui indice e in coada eliminam indicele din coada
deq.pop_back();
deq.push_back(i); ///aduagam elementul curent(care este cel minim)
if(deq.front() <= i - k) { ///daca primul element ramas in coada este mai mic decat i - k inseamna ca asta era pozitia minimului din seria anterioara si, de aceea, il eliminam
deq.pop_front();
}
s += v[deq.front()];
}
fout << s;
return 0;
}