Pagini recente » Cod sursa (job #1005793) | Cod sursa (job #464813) | Cod sursa (job #865956) | Cod sursa (job #616496) | Cod sursa (job #3127656)
#include <iostream>
#include <fstream>
#include <deque>
#include<vector>
using namespace std;
long long calculateMinSum(const vector<int>& arr, int K) {
int N = arr.size();
deque<int> dq;
long long sum = 0;
// Adăugăm primele K elemente în deque
for (int i = 0; i < K; i++) {
while (!dq.empty() && arr[i] < arr[dq.back()]) {
dq.pop_back();
}
dq.push_back(i);
}
// Parcurgem restul listei
for (int i = K; i < N; i++) {
// Adăugăm minimul din subsecvența anterioară în sumă
sum += arr[dq.front()];
// Eliminăm elementele din deque care nu mai sunt relevante pentru subsecvența curentă
while (!dq.empty() && dq.front() <= i - K) {
dq.pop_front();
}
// Eliminăm elementele mai mari decât elementul curent din deque
while (!dq.empty() && arr[i] < arr[dq.back()]) {
dq.pop_back();
}
// Adăugăm indicele elementului curent în deque
dq.push_back(i);
}
// Adăugăm ultimul minim în sumă
sum += arr[dq.front()];
return sum;
}
int main() {
ifstream fin("deque.in");
ofstream fout("deque.out");
int N, K;
fin >> N >> K;
vector<int> arr(N);
for (int i = 0; i < N; i++) {
fin >> arr[i];
}
long long result = calculateMinSum(arr, K);
fout << result << endl;
fin.close();
fout.close();
return 0;
}