Pagini recente » Cod sursa (job #1714185) | Cod sursa (job #2374009) | Cod sursa (job #757028) | Cod sursa (job #2869967) | Cod sursa (job #2720993)
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <utility>
struct Deque
{
//first is the nr, second is it's index
std::pair<int, int> *data;
void create(int size)
{
data = new std::pair<int, int>[size];
beginPos = 0;
endPos = 0;
}
//iterator like, endPos is one + the last element
int endPos;
int beginPos;
std::pair<int, int> &getEnd()
{
return data[endPos - 1];
}
std::pair<int, int> &getBegin()
{
return data[beginPos];
}
void removeEnd()
{
endPos--;
}
int size()
{
return (endPos - beginPos);
}
void removeBegin()
{
beginPos++;
}
void clear()
{
delete[] data;
}
std::pair<int, int> &elAtIndex(int i)
{
return data[beginPos + i];
}
void sort()
{
for (int i = 0; i < size(); i++)
{
for (int j = 0; j < size() - 1; j++)
{
auto &el1 = elAtIndex(j);
auto &el2 = elAtIndex(j + 1);
if (el1.first > el2.first)
{
auto el3 = el1;
el1 = el2;
el2 = el3;
}
}
}
}
void insertEnd(std::pair<int, int> p)
{
data[endPos++] = p;
}
};
int main()
{
std::ifstream f("deque.in");
if (!f.is_open())
{
return 1;
}
int n, k;
f >> n >> k;
int *v;
v = new int[n];
{
int vindex = 0;
for (int i = 0; i < n; i++)
{
int nr;
f >> nr;
v[vindex++] = nr;
}
}
Deque deque;
deque.create(n + 2);
long int suma = 0;
//for(int i=0; i<k; i++)
//{
// deque.insertEnd({ v[i], i });
//}
//
//deque.sort();
//suma += deque.getBegin().first;
for(int i=0; i<n; i++)
{
int ai = v[i];
while(deque.size())
{
auto el = deque.getEnd();
if(el.first >= ai)
{
deque.removeEnd();
}else
{
break;
}
}
deque.insertEnd({ ai, i });
if (deque.getBegin().second <= i - k)
{
deque.removeBegin();
}
int el = deque.getBegin().first;
if(i>=k-1)
{
suma += el;
}
}
f.close();
delete[] v;
std::ofstream fout("deque.out");
fout << suma;
fout.close();
return 0;
}