Pagini recente » Cod sursa (job #3000824) | Cod sursa (job #147212) | Cod sursa (job #1960159) | Cod sursa (job #1694576) | Cod sursa (job #1594176)
#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;
}
*/