Pagini recente » Cod sursa (job #93785) | Cod sursa (job #750409) | Cod sursa (job #1215863) | Cod sursa (job #45981) | Cod sursa (job #2887033)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("deque.in");
ofstream fout("deque.out");
struct Node
{
Node* next;
Node* prev;
int value;
Node(int x) {value = x; prev = next = NULL;}
};
class Deque
{
public:
Deque() {d_begin = d_end = NULL; d_size = 0;}
void dpush_back(int);
void dpush_front(int);
void dpop_back();
void dpop_front();
int dfront();
int dback();
bool dis_empty();
private:
Node* d_begin;
Node* d_end;
unsigned d_size;
};
void Deque::dpush_back(int x)
{
Node* temp = new Node(x);
if(d_size == 0)
d_begin = d_end = temp;
else
{
d_end->next = temp;
temp->prev = d_end;
d_end = temp;
}
d_size++;
}
void Deque::dpush_front(int x)
{
Node* temp = new Node(x);
if(d_size == 0)
d_begin = d_end = temp;
else
{
temp->next = d_begin;
d_begin->prev = temp;
d_begin = temp;
}
d_size++;
}
void Deque::dpop_back()
{
if(d_size > 1)
{
Node* temp = d_end;
d_end = d_end->prev;
delete temp;
}
else if(d_size == 1)
{
delete d_end;
d_end = d_begin = NULL;
}
d_size--;
}
void Deque::dpop_front()
{
if(d_size > 1)
{
Node* temp = d_begin;
d_begin = d_begin->next;
delete temp;
}
else if(d_size == 1)
{
delete d_begin;
d_end = d_begin = NULL;
}
d_size--;
}
int Deque::dfront()
{
if(d_size)
return d_begin->value;
}
int Deque::dback()
{
if(d_size)
return d_end->value;
}
bool Deque::dis_empty()
{
if(d_size)
return false;
return true;
}
int main()
{
Deque deq;
unsigned n, k;
long long sum;
sum = 0;
fin >> n >> k;
int* v = new int[n];
for(unsigned i = 0; i < n; i++)
{
fin >> v[i];
while(!deq.dis_empty() && v[i] <= v[deq.dback()])
deq.dpop_back();
deq.dpush_back(i);
if(deq.dfront() == i-k)
deq.dpop_front();
if(i >= k-1)
sum += v[deq.dfront()];
}
fout << sum;
return 0;
}