Pagini recente » Cod sursa (job #2534352) | Cod sursa (job #2419584) | Cod sursa (job #2697136) | Cod sursa (job #572417) | Cod sursa (job #1506627)
/*#include <iostream>
#include <cstdio>
using namespace std;
#include <deque>
long long n,x,l,i,k,y,j;
int main()
{
deque<long long> a,b;
freopen("deque.in","r",stdin);
freopen("deque.out","w",stdout);
cin>>n>>k;
cin>>x;
a.push_back(x);
b.push_back(1);
l=1;
for (i=1;i<k;i++)
{
cin>>x;
while (x<=a[l-1]&&l>0)
{
a.pop_back();
b.pop_back();
l--;
}
a.push_back(x);
b.push_back(i+1);
l++;
}
y=a[0];
for (i=k;i<n;i++)
{ /* cout<<i<<" ";
for (j=0;j<l;j++)
{
cout<<"("<<a[j]<<" , "<<b[j]<<") ";
}
cout<<'\n';
cin>>x;
if (i-b[0]==k-1&&l!=0)
{
l--;
a.pop_front();
b.pop_front();
}
while (x<=a[l-1]&&l>0)
{
a.pop_back();
b.pop_back();
l--;
}
a.push_back(x);
b.push_back(i+1);
l++;
y+=a[0];
}
/* for (j=0;j<l;j++)
{
cout<<"("<<a[j]<<" , "<<b[j]<<") ";
}
cout<<y;
}*/
#include <stdio.h>
#define maxn 5000010
int N, K;
int A[maxn], Deque[maxn];
int Front, Back;
long long Sum;
int main()
{
freopen("deque.in", "r", stdin);
freopen("deque.out", "w", stdout);
int i;
scanf("%d %d ", &N, &K);
// Citesc sirul dat
for (i = 1; i <= N; i++)
scanf("%d ", &A[i]);
Front = 1, Back = 0; // Initializare, Back < Front => deque-ul este vid
for (i = 1; i <= N; i++)
{
// Cat timp elementul curent este mai mic decat ultimul element din deque, eliminam pozitia ultimului element din deque
while (Front <= Back && A[i] <= A[ Deque[Back] ]) Back--;
// Adaugam pozitia elementului curent in deque
Deque[++Back] = i;
// Daca elementul minim coincide cu cel de pe pozita i-K, ii eliminam pozitia din deque, deoarece acesta nu mai conteaza pentru pasii >= i
if (Deque[Front] == i-K) Front++;
// Afisam minimul, acesta aflandu-se in varful deque-ului
if (i >= K) Sum += A[ Deque[Front]];
}
printf("%lld\n", Sum);
return 0;
}