Pagini recente » Cod sursa (job #1497610) | tema | Istoria paginii runda/vali_tigan/clasament | Cod sursa (job #2696230) | Cod sursa (job #2773452)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
int main()
{
int a[5000001] = {}, dq[5000001] = {}, n, k, front = 0, end = 0;
long long sum = 0;
//indexare de la 0
//in dq voi retine indicii valorilor posibile ale minimului
f>>n>>k;
for(int i = 0 ; i < n; ++i)
f>>a[i];
for(int i = 0; i < n; ++i){
//cat timp am elemente in dq si elementul curent din vector e mai mic decat cel din capat
//practic caut sa inserez indexul astfel incat pe dq[end] sa raman cu minimul curent
while(front <= end && a[i] <= a[dq[end]]){
end--;
}
//adaug indicele gasit pe ++end, intrucat a iesit din for cand a[i] > a[dq[end]], iar ultima data scazusem end ul cu 1 in end--
dq[++end] = i;
//daca primul element din deque corespunde cu pozitia primului element din secventa curenta de k elem inseamna ca trebuie sa mutam frontul, elementul din front
//urmand sa fie depasit la urmatorul pas, nevalabil pentru a fi luat in considerare ca minim curent
if(dq[front] == i-k) ++front;
//daca nu suntem in prima secventa de k, adaugam primul element din deq intrucat este un minim valabil
if(i + 1 >= k) sum += a[dq[front]];
}
g<<sum;
f.close();
g.close();
return 0;
}