Pagini recente » Cod sursa (job #706783) | Cod sursa (job #1051949) | Cod sursa (job #1085864) | Cod sursa (job #567068) | Cod sursa (job #1212564)
#include <fstream>
#define SIZE 5000001
using namespace std;
ifstream ifs("deque.in");
ofstream ofs("deque.out");
int A[SIZE];
typedef struct DequeNode
{
int val;
DequeNode* next;
DequeNode* prev;
} DequeNode;
typedef struct Deque
{
DequeNode* first;
DequeNode* last;
} Deque;
Deque* new_deque()
{
Deque* deque = new Deque;
deque->first = deque->last = 0;
return deque;
}
DequeNode* new_deque_node()
{
DequeNode* node = new DequeNode;
node->next = node->prev = 0;
return node;
}
bool is_empty_deque(Deque* deque)
{
return (deque->first == 0);
}
int get_last(Deque* deque)
{
return deque->last->val;
}
int get_first(Deque* deque)
{
return deque->first->val;
}
void remove_last(Deque* deque)
{
if (is_empty_deque(deque)) return;
DequeNode* prev = deque->last->prev;
if (deque->first == deque->last)
{
delete deque->first;
deque->first = 0;
deque->last = 0;
return;
}
delete deque->last;
deque->last = prev;
deque->last->next = 0;
}
void add_last(Deque* deque, int e)
{
DequeNode* node = new_deque_node();
node->val = e;
if (is_empty_deque(deque))
{
deque->first = node;
}
if (deque->last != 0)
{
deque->last->next = node;
node->prev = deque->last;
}
deque->last = node;
}
void remove_first(Deque* deque)
{
if (is_empty_deque(deque)) return;
DequeNode* next = deque->first->next;
if (deque->first == deque->last)
{
delete deque->last;
deque->last = 0;
deque->first = 0;
return;
}
delete deque->first;
deque->first = next;
deque->first->prev = 0;
}
int main()
{
int n, k;
int sum = 0;
Deque* deque = new_deque();
ifs >> n >> k;
for (int i = 1; i < k; ++i)
{
ifs >> A[i];
while (!is_empty_deque(deque) && A[i] < A[get_last(deque)])
{
remove_last(deque);
}
add_last(deque, i);
}
for (int i = k; i <= n; ++i)
{
if (get_first(deque) < (i-k+1))
{
remove_first(deque);
}
ifs >> A[i];
while (!is_empty_deque(deque) && A[i] < A[get_last(deque)])
{
remove_last(deque);
}
add_last(deque, i);
sum += A[get_first(deque)];
}
ofs << sum << "\n";
delete deque->first;
delete deque;
return 0;
}