Pagini recente » Cod sursa (job #217785) | Cod sursa (job #1932762) | Cod sursa (job #2611930) | Cod sursa (job #1459781) | Cod sursa (job #2791847)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("deque.in");
ofstream out("deque.out");
/**
coada dubla
de la d[p] la d[u]
adaugarea de elemente la inceput => folosita cel mai rar
k=3, n=9
1 2 3 4 5 6 7 8 9
v = 2 7 3 6 4 1 9 8 7
d = 1 x2x 3
eliminat de 3
un element este scos din deque cand nu mai are "nicio sansa"
vine un element mai mic
k elemente=> minim adaugat la suma
d = x1x 3 4
eliminat de 4
primul capat=> iesire normala din coada (deja k elemente)
al doilea capat=> stiva (vin elemente, pleaca cele mai mari)
**/
int v[5000001];
int d[5000001];
int main()
{
int n, k, p, u;
in>>n>>k;
long long suma=0;
for(int i=1; i<=n; i++)
in>>v[i];
p=1;
u=1;
d[1]=1;
if(k==1)
suma=suma+v[1];
for(int i=2; i<=n; i++){
while( u>=p && v[d[u]]>=v[i] )
u--;
if( u>=p && d[p] < i-k+1 )
p++;
u++;
d[u]=i;
if( i>=k )
suma=suma+v[d[p]];
}
out<<suma;
return 0;
}