Pagini recente » Cod sursa (job #71007) | Cod sursa (job #267047) | Cod sursa (job #3253714) | Cod sursa (job #1173390) | Cod sursa (job #3172387)
#include <bits/stdc++.h>
using namespace std;
#ifndef LOCAL
ifstream in("deque.in");
ofstream out("deque.out");
#define cin in
#define cout out
#endif
const int nmax = 5 * 1e6 + 7;
int v[nmax];
struct MinDeque {
deque<int> indexes; // retine indexii elementelor din deque
// eu vreau ca deque-ul indexes sa aiba o proprietate foarte specifica:
// v[indexes[i]] <= v[indexes[j]], practic vreau ca elementele din deque sa fie sortate crescator
// Cum fac asta? Am grija ca atunci cand adaug un element in deque sa scot toate elementele mai mari decat el
void add_element(int index) {
while(indexes.size() > 0 && v[indexes.back()] > v[index]) {
indexes.pop_back();
}
indexes.push_back(index);
}
// Apoi cand scot un element de la indexes.front(), de fapt il scot doar daca exista
// Fiindca anumite elemente dispar daca sunt alte elemente mai mici in dreapta lor
void remove_element(int index) {
if(indexes.size() > 0 && indexes.front() == index) {
indexes.pop_front();
}
}
int get_min() {
return v[indexes.front()]; // imi da _VALOAREA_ minimului
}
};
int main() {
int n, k; cin >> n >> k;
for(int i = 1; i <= n; i++) cin >> v[i];
// Varianta finala: Folosim un deque pentru a retine minimul pe fiecare interval de lungime k
// Folosim un deque pentru a retine minimul pe fiecare interval de lungime k
MinDeque md;
for(int i = 1; i <= k; i++) {
md.add_element(i);
}
long long ans = md.get_min();
for(int i = k + 1; i <= n; i++) {
md.add_element(i);
md.remove_element(i - k);
ans += md.get_min();
}
cout << ans << "\n";
}