Pagini recente » Cod sursa (job #2790373) | Cod sursa (job #1028829) | Cod sursa (job #2515318) | Cod sursa (job #501253) | Cod sursa (job #2615001)
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream in("deque.in");
ofstream out("deque.out");
//pt fiecare subsecventa de lungime K sa se determine minimul, iar apoi sa se calculeze suma acestor minime
class Deque
{
private:
int *coada;
int fata;
int spate;
public:
Deque(int n = 5000000)
{
fata = 0;
spate = -1;
coada = new int[n];
}
~Deque()
{
fata = 0;
spate = -1;
delete []coada;
}
void insereaza_fata(int val)
{
if(fata>0)
{
fata--;
coada[fata] = val;
}
}
void insereaza_spate(int val)
{
spate++;
coada[spate] = val;
}
bool isempty()
{
if(fata > spate)
return true;
return false;
}
void sterge_fata()
{
fata++; //se sterge primul elem;
}
void sterge_spate()
{
spate = spate -1;//se sterge ultimul elem;
}
int get_fata()
{
return coada[fata];
}
int get_spate()
{
return coada[spate];
}
};
int main()
{
//minimul mereu in vf deque ului;
int n,k,x;
long long suma = 0;
in>>n>>k;
Deque dcoada(n);
vector<int>elem;
elem.reserve(n);
int i = 0;
while(i<n)
{
in>>x;
elem.push_back(x);
i++;
}
// for (auto it = elem.begin(); it != elem.end(); it++)
// cout << *it << " ";
dcoada.insereaza_spate(0);
for(int i = 1; i<n; i++)
{
//Cat timp elementul curent este mai mic decat ultimul element din deque se elim ultimul elem;
while(!dcoada.isempty() && elem[i]<= elem[dcoada.get_spate()])
{
dcoada.sterge_spate();
}
dcoada.insereaza_spate(i);//se adauga in spate ultimul element;
if(i>= k -1)//se adauga minimul la suma;
{
suma += elem[dcoada.get_fata()];
//cout<< elem[dcoada.get_fata()]<<" ";
}
if(!dcoada.isempty() && dcoada.get_fata() == i-k+1)// Daca elementul minim coincide cu cel de pe pozita i-K, se sterge pozitia lui din deque;
dcoada.sterge_fata();
}
//cout<<"\n"<<suma;
out<<suma;
in.close();
out.close();
return 0;
}