Pagini recente » Cod sursa (job #901135) | Cod sursa (job #1202723) | Cod sursa (job #2636393) | Cod sursa (job #2975513) | Cod sursa (job #2705004)
#include <iostream>
#include <algorithm>
using namespace std;
/*
STIVA/COADA DUBLA = double ended queue
= deque
d[p]..........d[u]
<-se pleaca ....se vine/se pleaca
p++ u++ / u--
n=9 k=3
i = 1 2 3 4 5 6 7 8 9
v[i]= 3 1 5 2 4 1 8 2 5
d[p]..........d[u]
v[d[p]]>=.......>=v[d[u]]
7 9
s=0+v[3] + v[3] + v[3] + v[5] + v[7] + v[7] +v[7]
Suma maximelor tuturor secventelor
de k elemente
*/
int v[5000001];
int d[5000001]; // 6+5+4+3+2+3+5
int main()
{
int n,k;
long long s=0;
cin>>n>>k;
for(int i=1; i<=n; i++)
{
cin>>v[i];
}
int p=1, u=1;
d[1]=1; if(k==1)s=v[1];
for(int i=2; i<=n; i++){
// v[i-k+1] .... v[i] o secventa
// i>=k
while(v[i]<v[d[u]] && u>=p)u--;
// se poate scoate tot u==p-1
u++; // vine in deque
d[u]=i;
if(i>=k && d[p]<i-k+1)p++;
if(i>=k) s=s+ v[d[p]];
}
cout<<s;
}