Pagini recente » Cod sursa (job #2665546) | Cod sursa (job #1398221) | Cod sursa (job #237677) | Cod sursa (job #1444723) | Cod sursa (job #843300)
Cod sursa(job #843300)
#include <stdio.h>
#include <stdlib.h>
#define MAXN 5000002
int v[MAXN];
int ququ[MAXN];
int N,K;
////////////// QUEUE ///////////////////
typedef struct tagQueue{
int start;
int end;
}Queue;
void initQueue(Queue *q)
{
q->start = MAXN;
q->end = MAXN-1;
}
void pushQueue(Queue *q, int pos)
{
if( q->start > q->end ){
q->start = MAXN-1;
q->end = MAXN-1;
ququ[MAXN-1] = pos;
}
else{
int s = q->start;
while( s <= q->end && v[ququ[s]] >= v[pos] )
s++;
if( s > q->end ){
q->start = MAXN-1;
q->end = MAXN-1;
ququ[MAXN-1] = pos;
}
else{
q->start = s-1;
ququ[s-1] = pos;
}
}
}
int topQueue(Queue *q)
{
return ququ[q->end];
}
void popQueue(Queue *q, int v)
{
if( ququ[q->end] != v )
return;
if( q->start == q->end){
q->start = MAXN;
q->end = MAXN-1;
}
else{
q->end--;
}
}
void printQueue(Queue *q)
{
int i;
for(i=q->start;i<q->end;i++)
printf("%d ",v[ququ[i]]);
printf("\n");
fflush(stdout);
}
////////////////////////////////////////
int main(int argc, char* argv[])
{
freopen("deque.in","r",stdin);
freopen("deque.out","w",stdout);
scanf("%d %d",&N,&K);
int i;
for(i=1;i<=N;i++)
scanf("%d",&v[i]);
Queue q;
long long sum = 0;
initQueue(&q);
for(i=1;i<=K;i++)
pushQueue(&q,i);
sum += v[topQueue(&q)];
for(i=K+1;i<=N;i++){
popQueue(&q, i-K);
pushQueue(&q, i);
sum += v[topQueue(&q)];
}
printf("%lld",sum);
return 0;
}