Pagini recente » Cod sursa (job #1603591) | Cod sursa (job #166070) | Cod sursa (job #1853990) | Cod sursa (job #827881) | Cod sursa (job #3283012)
/*
idee principala: problema cere sa determinam minimul fiecarei subsecvente de lungime k
intr un sir de lungime n si sa calculam suma acestor minime
folosim un deque (coada cu acces la ambele capete) pentru a mentine eficient minimul fiecarei
subsecvente
*/
#include <bits/stdc++.h>
using namespace std;
int main() {
ifstream cin("deque.in");
ofstream cout("deque.out");
int n, k;
cin >> n >> k;
long long sum = 0;
vector<int> v(n);
deque<int> dq;
for (int i = 0; i < n; i++) {
cin >> v[i];
// elimin elementele iesite din fereastra k
// daca elementul din capul deque-ului (dq.front()) a iesit din fereastra de k elemente,
// il eliminam
// ex: daca i = 3 si k = 3, atunci elementul i - k = 0 trebuie eliminat
if (!dq.empty() && dq.front() == i - k)
dq.pop_front();
// eliminarea elementelor mai mari din dreapta (pentru mentinerea minimului)
// elimin toate elementele din spatele deque-ului care sunt mai mari decat noul element
// v[i], deoarece acestea nu vor mai putea fi minime intr-o fereastra viitoare
// ex: (9, 2, 4) -> la pasul cu 2 eliminam 9 din dq deoarece 2 este mai mic si devine noul
// candidat pentru minim
// la pasul cu 4, pastrez 2 deoarece 2 < 4
while (!dq.empty() && v[i] <= v[dq.back()])
dq.pop_back();
// adaug noul element in dq
dq.push_back(i);
// calculul sumei minimelor
// incepand de al k-lea element (i >= k - 1)
// adaugam in sum valoarea minima a unei ferestre curente
// minimul este mereu la pozitia dq.front()
if (i >= k - 1)
sum += v[dq.front()];
}
cout << sum;
return 0;
}