Pagini recente » Cod sursa (job #1788251) | Cod sursa (job #1322218) | Cod sursa (job #2933394) | Cod sursa (job #1713697) | Cod sursa (job #1052769)
#include <fstream>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <utility>
#include <cstdio>
using namespace std;
/*
ifstream in ("deque.in");
ofstream out("deque.out");
*/
vector<int>* getAllPositions(const unordered_multimap<int, int>& myHash, int minim)
{
vector<int> *pozitii = new vector<int>;
unordered_multimap<int, int>::const_iterator it = myHash.find(minim);
while (it->first == minim)
{
pozitii->push_back(it->second);
++it;
if (it == myHash.end())
break;
}
// oare mere mai bine in heap ?
return pozitii;
}
int v[5000001];
int main()
{
FILE *in, *out;
in = fopen ("deque.in" , "r");
out = fopen ("deque.out", "w");
int n, k; fscanf(in, "%d%d", &n, &k);
unordered_multimap<int, int> myHash;
for (int i = 1; i <= n; ++i)
{
fscanf (in, "%d", &v[i]);
myHash.insert(make_pair(v[i], i));
}
vector<int> heap;
for (int i = 1; i <= k; ++i)
heap.push_back(-v[i]);
make_heap(heap.begin(), heap.end());
long long suma = 0;
suma += -heap[0];
for (int i = k + 1; i <= n; ++i)
{
heap.push_back(-v[i]);
push_heap(heap.begin(), heap.end());
bool ok = false;
while (ok == false)
{
int minim = -heap[0];
vector <int> *pozitiiAleMinimului = getAllPositions(myHash, minim);
bool exista = false;
for (vector<int>::iterator it = pozitiiAleMinimului->begin();
it != pozitiiAleMinimului->end();
++it)
if (*it >= i - k + 1 && *it <= i)
{
exista = true;
ok = true;
break;
}
delete pozitiiAleMinimului;
if (exista == true)
suma += minim;
else
pop_heap(heap.begin(), heap.end()), heap.pop_back();
}
}
fprintf (out, "%d", suma);
fclose (in);
fclose (out);
return 0;
}