Cod sursa(job #1594176)

Utilizator bullseYeIacob Sergiu bullseYe Data 9 februarie 2016 11:40:55
Problema Deque Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 2.87 kb
#include <cstdio>
#define NMAX 5000010
using namespace std;

void citire();
void solve();
void afisare();

int n, A[NMAX], k;
long long int sol;
int dque[NMAX];

int main(){
citire();
solve();
afisare();
}

void citire(){
int i;
FILE*fin=fopen ("deque.in", "r");
fscanf(fin, "%d %d", &n, &k);
for (i=1; i<=n; ++i)
    fscanf(fin, "%d", &A[i]);
fclose(fin);
return;
}

void solve(){
int first, last, i;
first=1; last=0;

for (i=1; i<=n; ++i){
        //inserez un element nou
        while (first<=last && A[i]<=A[dque[last]])
            --last;
        dque[++last]=i;
        if (dque[first] == i-k) first++;

        if (i>=k)//adun minimul pentru fiecare secventa
            sol+=A[dque[first]];
    }
return;
}

void afisare(){
    FILE*fout=fopen("deque.out", "w");
    fprintf(fout, "%d\n", sol);
    fclose(fout);
    return;
}


/*#include <cstdio>
#define NMAX 5000010
using namespace std;

struct nod{
struct nod *prev, *next;
int inf;
};
struct nod *deque_begin, *deque_end;

int n, A[NMAX], k, sol;
int doublequeue[NMAX];

void citire();
void solve();
void afisare();
void insert_deque (struct nod*, int);
void delete_deque (struct nod*);


int main(){
citire();
solve();
afisare();
return 0;
}

void citire(){
int i;
FILE*fin=fopen ("deque.in", "r");
fscanf(fin, "%d %d", &n, &k);
for (i=1; i<=n; ++i)
    fscanf(fin, "%d", &A[i]);
fclose(fin);
return;
}

void solve()
{
    int i;
    deque_begin=deque_end=NULL;
    //pun primu nod in lista
    insert_deque(NULL, 1);
    deque_begin=deque_end;
    for (i=2; i<=n; ++i)//i have no idea what i'm doing here. really.
    {
        if (deque_begin->inf<i-k){//dispare din secventa
            sol+=A[deque_begin->inf];
            delete_deque(deque_begin);
        }
        //inserez un nou nod
        while (deque_end!=NULL && A[i]<A[deque_end->inf])
            delete_deque(deque_end);
        insert_deque(deque_end, i);
    }

}

void insert_deque (struct nod *where, int what){
struct nod *x=new nod;
x->inf=what;
if (where==NULL){//inserez la inceput
    x->next=deque_begin; x->prev=NULL;
    deque_begin->prev=x;
    deque_begin=x;
    }
    else{//inserez dupa where
    x->next=where->next;
    x->next->prev=x;
    where->next=x;
    x->prev=where;
    if (where==deque_end)
        deque_end=x;
    }
return;
}

void delete_deque (struct nod *what){
struct nod *x;
if (what==NULL) return;//daca n-am ce sterge
if (what==deque_begin){
    x=deque_begin;
    deque_begin=x->next;
    deque_begin->prev=NULL;
    delete x;
}
    else{
    if (what->prev)
        what->prev->next=what->next;
    if (what->next)
        what->next->prev=what->prev;
    delete what;
    }
return;
}

void afisare(){
    FILE*fout=fopen("deque.out", "w");
    fprintf(fout, "%d\n", sol);
    fclose(fout);
    return;
}
*/