Pagini recente » Cod sursa (job #1886880) | Cod sursa (job #1885147) | Cod sursa (job #2249628) | Cod sursa (job #1369018) | Cod sursa (job #2249529)
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <array>
#include <algorithm>
#include <vector>
#include <stack>
#include <set>
#include <assert.h>
#include <queue>
#include <chrono>
#include <cstring>
#include <memory>
#include <queue>
#include <deque>
using LL = long long;
using ULL = int long long;
const std::string _problemName = "deque";
namespace std {
std::ifstream fin(_problemName + ".in");
std::ofstream fout(_problemName + ".out");
}
#define USE_FILES
#ifdef USE_FILES
#define cin fin
#define cout fout
#endif
struct Element {
int value;
int position;
Element(int value, int position) {
this->value = value;
this->position = position;
}
};
void add(std::deque<Element>& deque, int element, int index) {
while (!deque.empty() && deque.back().value >= element) {
deque.pop_back();
}
deque.emplace_back(element, index);
}
int getMin(const std::deque<Element>& deque) {
return deque.front().value;
}
void removeOlderThan(std::deque<Element>& deque, int removeBefore) {
if (!deque.empty() && deque.front().position <= removeBefore) {
deque.pop_front();
}
}
LL computeSubsequenceMinimumsSum(const std::vector<int>& vector, int subsequenceLength) {
std::deque<Element> deque;
for (int idx = 0; idx < subsequenceLength; ++idx) {
add(deque, vector[idx], idx);
}
LL sum = getMin(deque);
for(int idx = subsequenceLength; idx < (int) vector.size(); ++idx) {
removeOlderThan(deque, idx - subsequenceLength);
add(deque, vector[idx], idx);
sum += getMin(deque);
}
return sum;
}
int main() {
int n, k;
std::cin >> n >> k;
std::vector<int> v(n);
for (auto& it : v) {
std::cin >> it;
}
std::cout << computeSubsequenceMinimumsSum(v, k) << '\n';
return 0;
}