Pagini recente » Cod sursa (job #935080) | Cod sursa (job #2552052) | Rating Morosan Andrei (morosanandrei) | Cod sursa (job #2307028) | Cod sursa (job #2722700)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("deque.in");
ofstream out("deque.out");
int v[5000005];
int d[5000005];
long long suma;
int main()
{
/**
DEQUE
v= 7 5 8 9 6 14 5 11 4
d= 7 5 8 9 6 14 5
elim de catre 5 d[p] ii scoate pe 8 si 9 k elem=> il scoate pe 5 elimina tot
elementele sunt eliminate cand:
1 vine un element mai mic
2 au trecut deja k elemente
! deque cu indici, nu valori => verif si cand au trecut k elemente
suma= 5+5+6+5+5+4
1 2 3 4 5 6 k=3
v= 7 11 20 21 30 45
d= 1 2 3 4 5 6
prea vechi=>scoatem x x =>scoatem elem >= v[i] (nu pot fi minime)
de la i-k+1 la i
OBS! elementele sunt mereu crescatoare
v[ d[p] ] < v[ d[p+1] ] < ... < v[ d[u] ]
!!!! d[p] >= d[u] - k + 1
**/
int n, k;
in>>n>>k;
for(int i=1; i<=n; i++){
in>>v[i];
}
int p, u;
p=1;
u=1;
d[1]=1;
if(k==1){
suma+=v[1];
}
for(int i=1; i<=n; i++){
/// i-k+1 ..... i
while( p<=u && v[ d[u] ]>=v[i] )
u--;
if( p<=u && d[p]<i-k+1 )
p++;
u++;
d[u]=i;
if(i>=k)
suma=suma+v[ d[p] ];
}
out<<suma;
return 0;
}