Pagini recente » Cod sursa (job #2737920) | Cod sursa (job #2917284) | Cod sursa (job #1300762) | Cod sursa (job #3300248) | Cod sursa (job #1493100)
#include <fstream>
#include <queue>
#include <vector>
#include <iostream>
#define VMAX 5000001
using namespace std;
void read();
void solve();
void write();
int n, k;
long int sum;
vector<long int > values;
deque<long int > d;
int main()
{
read();
solve();
write();
return 0;
}
void read()
{
ifstream fin( "deque.in" );
fin >> n >> k;
for ( int i = 0; i < n; ++i )
{
long int x;
fin >> x;
values.push_back(x);
}
fin.close();
}
void solve()
{
for ( int i = 0; i < values.size(); ++i )
{
//la fiecare pas i, elementul curent Ai elimina de la finalul deque-ului toate elementele mai mari sau egale cu el,
while ( !d.empty() && values[ i ] <= values[d.back()] )
d.pop_back();
// apoi este inserat la finalul cozii.
d.push_back( i );
//se elimina apoi minimul de la inceputul cozii daca acesta nu mai apartine secventei curente (pozitia lui este mai mica sau egala cu i-K)
if ( d.front() == i - k)
d.pop_front();
//in final, se aduna minimul la solutie.
if ( i >= k - 1)
sum += values[ d.front() ];
}
}
void write()
{
ofstream fout( "deque.out" );
fout << sum;
fout.close();
}