Pagini recente » Cod sursa (job #681348) | Cod sursa (job #2583002) | Cod sursa (job #2491349) | Cod sursa (job #69983) | Cod sursa (job #2591747)
#include <stdlib.h>
#include <stdio.h>
#define MAXN 5000010
typedef struct deque {
int *mem_start, *start, *end;
size_t max_sz, curr_sz;
} t_deque;
#define NEXT(p) ((p) + 1)
#define MEM_END(p) (p->mem_start + p->max_sz)
t_deque *create_deque(size_t size);
void push_back(t_deque *deque, int value);
int pop_back(t_deque *deque);
int pop_front(t_deque *deque);
int get_back(t_deque *deque);
int get_front(t_deque *deque);
int empty(t_deque *deque);
t_deque *create_deque(size_t size)
{
t_deque *deque;
deque = (t_deque *) malloc(sizeof(t_deque));
deque->mem_start = (int *) malloc(size * sizeof(int));
deque->start = deque->mem_start;
deque->end = deque->start - 1;
deque->max_sz = size;
deque->curr_sz = 0;
return deque;
}
void push_back(t_deque *deque, int value)
{
if(deque->curr_sz >= deque->max_sz) {
return;
}
deque->end = NEXT(deque->end);
if(deque->end == MEM_END(deque)) {
deque->end = deque->mem_start;
}
*(deque->end) = value;
deque->curr_sz++;
}
int pop_back(t_deque *deque)
{
int value = *(deque->end);
if(deque->end == deque->mem_start) {
deque->end = MEM_END(deque) - 1;
}
else {
deque->end--;
}
deque->curr_sz--;
return value;
}
int pop_front(t_deque *deque)
{
int value = *(deque->start);
if(NEXT(deque->start) == MEM_END(deque)) {
deque->start = deque->mem_start;
}
else {
deque->start = NEXT(deque->start);
}
deque->curr_sz--;
return value;
}
int get_back(t_deque *deque)
{
return *(deque->end);
}
int get_front(t_deque *deque)
{
return *(deque->start);
}
int empty(t_deque *deque)
{
return deque->curr_sz == 0;
}
int v[MAXN];
int main()
{
FILE *fin = fopen("deque.in", "r"),
*fout = fopen("deque.out", "w");
t_deque *deque;
long long sum = 0;
int n, k, i;
fscanf(fin, "%d %d", &n, &k);
for(i = 0; i < n; i++) {
fscanf(fin, "%d", &v[i]);
}
deque = create_deque(k + 10);
for(i = 0; i < n; i++) {
while(v[get_back(deque)] > v[i] && !empty(deque)) {
pop_back(deque);
}
push_back(deque, i);
if(i - k == get_front(deque)) {
pop_front(deque);
}
if(i >= k - 1) {
sum += v[get_front(deque)];
}
}
fprintf(fout, "%lld", sum);
fclose(fin);
fclose(fout);
}