Pagini recente » Cod sursa (job #2335299) | Cod sursa (job #2857490) | Cod sursa (job #1099237) | Cod sursa (job #941895) | Cod sursa (job #2630600)
#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 cele mai mici elemente din subsirul trecut de k elemente
/// si cum gasim ca un element e mai mare ii eliminam indicele din deque
/// daca minimul dintre acele element e fix primul element subsirul trecut 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 indicele elementului curent(care este cel minim, ma refer la element)
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;
}