Pagini recente » Cod sursa (job #787173) | Borderou de evaluare (job #1567657) | Cod sursa (job #468108) | Cod sursa (job #687208) | Cod sursa (job #2761986)
#include<fstream>
#include <iostream>
using namespace std;
int v[1000000];
int deque[1000000];
int main()
{
// folosesc coada cu 2 capete in care memorez pozitiile din vectorul
// v si pozitiile vor fi in ordine crescatoare pentru ca stergem mereu cand
// gasim o pozitie din v mai mica
ifstream f("deque.in");
ofstream g("deque.out");
int i, n, k;
int primul, ultim;
int suma = 0;
f >> n>> k;
for (i = 0; i < n; i++) {
f >> v[i];
}
primul = 0;
ultim = -1;
for (i = 0; i < n; i++) {
//la fiecare parcurgere valoarea v[i] eliminia de la finalul lui v
//toate elementele mai mari sau egale cu el
//deci, el devine noul minim pentru urmatoarele posbile secvente
while (primul <= ultim and v[i] <= v[deque[ultim]]) {
ultim--;
}
//il adaugam la finalul lui deque pozitia
ultim++;
deque[ultim] = i;
//sterg de la inceput lui deque dc minimul nu apartine subsecventei
if (deque[primul] + k == i)
primul++;
//Ruleaza bine aici
//daca avem minim o subsecventa de k elemente
//?
if (i >= k)
suma = suma + v[deque[primul]];
}
g << suma;
}