Pagini recente » Cod sursa (job #2487436) | Cod sursa (job #548020) | Cod sursa (job #1986136) | Cod sursa (job #2835068) | Cod sursa (job #3031657)
#include <bits/stdc++.h>
using namespace std;
// A Dequeue (Double ended queue) based method for printing maximum element of
// all subarrays of size k
ifstream fin("deque.in");
ofstream fout("deque.out");
int suma = 0;
void printKMax(int arr[], int n, int k)
{
// Create a Double Ended Queue, Qi that will store indexes of array elements
// The queue will store indexes of useful elements in every window and it will
// maintain decreasing order of values from front to rear in Qi, i.e.,
// arr[Qi.front[]] to arr[Qi.rear()] are sorted in decreasing order
std::deque<int> Qi(k);
/* Process first k (or first window) elements of array */
int i;
for (i = 0; i < k; ++i) {
// For every element, the previous smaller elements are useless so
// remove them from Qi
while ((!Qi.empty()) && arr[i] <= arr[Qi.back()])
Qi.pop_back(); // Remove from rear
// Add new element at rear of queue
Qi.push_back(i);
}
// Process rest of the elements, i.e., from arr[k] to arr[n-1]
for (; i < n; ++i) {
// The element at the front of the queue is the largest element of
// previous window, so print it
//cout << arr[Qi.front()] << " ";
suma += arr[Qi.front()];
// Remove the elements which are out of this window
while ((!Qi.empty()) && Qi.front() <= i - k)
Qi.pop_front(); // Remove from front of queue
// Remove all elements smaller than the currently
// being added element (remove useless elements)
while ((!Qi.empty()) && arr[i] <= arr[Qi.back()])
Qi.pop_back();
// Add current element at the rear of Qi
Qi.push_back(i);
}
// Print the maximum element of last window
// cout << arr[Qi.front()];
suma += arr[Qi.front()];
fout << suma;
}
// Driver program to test above functions
int main()
{
int p;
fin >> p;
int arr[p];
int k;
fin >> k;
for(int i = 0; i < p; ++i) {
fin >> arr[i];
}
int n = sizeof(arr) / sizeof(arr[0]);
printKMax(arr, n, k);
return 0;
}