Pagini recente » Cod sursa (job #1724984) | Cod sursa (job #1271920) | Cod sursa (job #2945974) | Cod sursa (job #114877) | Cod sursa (job #1482544)
#include <stdio.h>
#include <stdlib.h>
int A[5000010];
typedef struct DequeNode {
int el;
struct DequeNode *next;
struct DequeNode *prev;
}DNode;
typedef struct Deque {
DNode *p;
DNode *l;
}Deque;
struct Deque* createDeque() {
struct Deque *d = (struct Deque*)malloc(sizeof(struct Deque));
d->p = (struct DequeNode*)malloc(sizeof(struct DequeNode));
d->l = (struct DequeNode*)malloc(sizeof(struct DequeNode));
d->p->next = d->l;
d->p->next->prev = d->p;
return d;
}
struct DequeNode* createNode(int el) {
struct DequeNode *node = (struct DequeNode*)malloc(sizeof(struct DequeNode));
node->el=el;
node->next=NULL;
return node;
}
void offerBeginning(struct Deque *deque, int el) {
struct DequeNode *newNode = createNode(el);
newNode->next = deque->p->next;
deque->p->next = newNode;
deque->p->next->prev = deque->p;
newNode->next->prev=newNode;
}
void offerEnd(struct Deque *deque, int el) {
struct DequeNode *newNode = createNode(el);
deque->l->prev->next = newNode;
newNode->prev = deque->l->prev;
newNode->next = deque->l;
deque->l->prev = newNode;
}
int pollBeginning(struct Deque *deque) {
//printf("HERE");
if(!isEmpty(deque)) {
struct DequeNode *node = deque->p->next;
deque->p->next->next->prev = deque->p;
deque->p->next = deque->p->next->next;
long long int el = node->el;
free(node);
return el;
} else {
printf("Deque is empty!");
}
}
int pollEnd(struct Deque *deque) {
if(!isEmpty(deque)) {
struct DequeNode *node = deque->l->prev;
deque->l->prev->prev->next = deque->l;
deque->l->prev = deque->l->prev->prev;
long long int el = node->el;
free(node);
return el;
} else {
printf("Deque is empty!");
}
}
int getLastElement(struct Deque *deque) {
if(!isEmpty(deque)) {
return deque->l->prev->el;
}
}
int getFirstElement(struct Deque *deque) {
if(!isEmpty(deque)) {
return deque->p->next->el;
}
}
int isEmpty(struct Deque *deque) {
return deque->p->next == deque->l;
}
void testDeque(struct Deque *deque) {
struct DequeNode *temp = deque->p->next;
while(temp != deque->l) {
printf("%d ",temp->el);
temp=temp->next;
}
}
int main(void) {
FILE *fin,*fout;
int N,K;
int i;
long long sum = 0;
fin=fopen("deque.in","r");
fout=fopen("deque.out","w");
fscanf(fin,"%d %d",&N,&K);
struct Deque *deque = createDeque();
for(i=1;i <= N;i++) {
fscanf(fin,"%d",&A[i]);
}
for(i=1;i<=N;i++) {
while(!isEmpty(deque) && A[i] <= A[getLastElement(deque)]) {
pollEnd(deque);
}
offerEnd(deque,i);
if(getFirstElement(deque) == i-K) {
pollBeginning(deque);
}
if(i >= K) {
sum+=A[getFirstElement(deque)];
}
}
fprintf(fout,"%lld",sum);
return 0;
}