Pagini recente » Cod sursa (job #1034531) | Cod sursa (job #1219890) | Cod sursa (job #1437897) | Cod sursa (job #1996474) | Cod sursa (job #2729713)
#include <iostream>
#include <fstream>
#include <deque>
#include <vector>
using namespace std;
ifstream fin("deque.in");
ofstream fout("deque.out");
/* Problema Deque - infoarena
Pentru a rezolva problema vom folosi o coada dubla care va retine pe prima pozitie, minimul secventei curente.
Adaugam la coada elementele avand grija sa scoatem elementele de la inceputul cozii care
sunt mai mari decat elementul curent pentru a muta elementul minim pe prima pozitie.
Trebie sa verificam si ca elementul de pe prima pozitie se afla inca in secventa curenta - pentru a rezolva aceasta problema
vom pune in coada dubla pozitiile elementelor din vectorul initial si vom verifica ca
*/
int v[5000005], q[5000005];
int st, dr;
int n,k;
long long s;
int main()
{
///Initializare coada dubla vida
st = 0;
dr = -1;
///Citire
fin>>n>>k;
for(int i=0;i<n;i++)
fin>>v[i];
fin.close();
for(int i=0;i<n;i++){
/// mutam minimul pe prima pozitie
while(st <= dr && v[q[dr]] >= v[i])
dr--;
q[++dr] = i; /// adaugam pozitia noului element la final
if(q[st] == i - k) /// verificam ca minimul din coada sa fie inca in secventa curenta
st++;
if(i >= k - 1) /// avem grija sa nu punem toate elmentele din prima secventa ca minime
s += v[q[st]];
}
fout<<s;
fout.close();
return 0;
}