Cod sursa(job #1482544)

Utilizator pitbull007Hurmuzache Ciprian pitbull007 Data 7 septembrie 2015 14:51:11
Problema Deque Scor 60
Compilator c Status done
Runda Arhiva educationala Marime 2.96 kb
#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;
}