Pagini recente » Cod sursa (job #2114268) | Cod sursa (job #2301599) | Cod sursa (job #1943598) | Cod sursa (job #956735) | Cod sursa (job #1052689)
#include <fstream>
#include <vector>
#include <map>
#include <algorithm>
#include <utility>
using namespace std;
ifstream in ("deque.in");
ofstream out("deque.out");
vector<int> getAllPositions(const multimap<int, int>& myHash, int minim)
{
vector<int> pozitii;
multimap<int, int>::const_iterator it = myHash.find(minim);
while (it->first == minim)
{
pozitii.push_back(it->second);
++it;
}
// oare mere mai bine in heap ??
return pozitii;
}
int main()
{
int n, k; in >> n >> k;
multimap<int, int> myHash;
int v[500001];
for (int i = 1; i <= n; ++i)
{
in >> v[i];
myHash.insert(make_pair(v[i], i));;
}
vector<int> heap;
for (int i = 1; i <= k; ++i)
heap.push_back(-v[i]), push_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());
int minim = -heap[0];
vector <int> pozitiiAleMinimului = getAllPositions(myHash, minim);
bool exista = false;
for (auto &it : pozitiiAleMinimului)
if (it >= i - k + 1 && it <= i)
{
exista = true;
break;
}
if (exista == true)
suma += minim;
else
{
pop_heap(heap.begin(), heap.end());
--i;
}
}
out << suma;
return 0;
}