Pagini recente » Cod sursa (job #1102202) | Cod sursa (job #2529409) | Cod sursa (job #239653) | Cod sursa (job #1929674) | Cod sursa (job #2217695)
#include <bits/stdc++.h>
using namespace std;
struct Node{
int value;
Node *prev, *next;
};
class Deque{
public:
Deque(){
first = nullptr;
last = nullptr;
}
int Empty(){
if(first == nullptr)
return 1;
return 0;
}
void PushFirst(int value){
Node *aux = new Node;
aux->value = value;
if(nullptr == first){
aux->prev = aux->next = nullptr;
first = last = aux;
return;
}
aux->prev = nullptr;
aux->next = first;
first->prev = aux;
first = aux;
return;
}
void PushLast(int value){
Node *aux = new Node;
aux->value = value;
if(nullptr == first){
aux->prev = aux->next = nullptr;
first = last = aux;
return;
}
aux->next = nullptr;
aux->prev = last;
last->next = aux;
last = aux;
return;
}
void PopFirst(){
if(first == last){
delete first;
first = last = nullptr;
return;
}
Node *aux = first;
first = first->next;
first->prev = nullptr;
delete aux;
}
void PopLast(){
if(first == last){
delete first;
first = last = nullptr;
return;
}
Node *aux = last;
last = last->prev;
last->next = nullptr;
delete aux;
}
int GetFirst(){
return first->value;
}
int GetLast(){
return last->value;
}
private:
Node *first;
Node *last;
};
const int NMax = 5000003;
int n,k;
int a[NMax];
int main(){
freopen("deque.in","r",stdin);
freopen("deque.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i = 1; i <= n; ++i)
scanf("%d",&a[i]);
Deque *deq = new Deque;
long long ans = 0;
for(int i = 1; i <= n; ++i){
if(deq->Empty()){
deq->PushLast(i);
continue;
}
if(i - k + 1 > deq->GetFirst())
deq->PopFirst();
while(!deq->Empty() && a[i] <= a[deq->GetLast()])
deq->PopLast();
deq->PushLast(i);
if(i >= k)
ans += 1LL*a[deq->GetFirst()];
}
printf("%lld\n",ans);
return 0;
}