Mai intai trebuie sa te autentifici.
Cod sursa(job #1052884)
Utilizator | Data | 11 decembrie 2013 21:19:45 | |
---|---|---|---|
Problema | Deque | Scor | 60 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.24 kb |
#include <iostream>
#include <deque>
using namespace std;
struct elmt
{
int d_time, value;
};
long long makeStep(deque<elmt> &d, int k, int offset, int n);
int main()
{
freopen("deque.in", "r", stdin);
freopen("deque.out", "w", stdout);
int n, k, offset;
deque<elmt> deq;
cin >> n >> k;
for (int i = 0; i < k - 1; i++)
{
int val;
elmt e;
cin >> val;
if (deq.empty())
{
e.value = val;
e.d_time = i + k;
deq.push_back(e);
}
else
{
while (!deq.empty() && deq.back().value > val)
{
deq.pop_back();
}
e.value = val;
e.d_time = i + k;
deq.push_back(e);
}
}
offset = k - 1;
cout << makeStep(deq, k, offset, n);
}
long long makeStep(deque<elmt> &d, int k, int offset, int n)
{
int val;
elmt e;
long long sum = 0;
while (offset < n)
{
cin >> val;
if (d.empty())
{
e.value = val;
e.d_time = offset + k;
d.push_back(e);
}
else
{
while (!d.empty() && d.back().value > val)
{
d.pop_back();
}
e.value = val;
e.d_time = offset + k;
d.push_back(e);
}
while (!d.empty() && d.front().d_time <= offset)
{
d.pop_front();
}
offset++;
sum += d.front().value;
}
return sum;
}