Cod sursa(job #1052689)

Utilizator bghimisFMI Ghimis Bogdan bghimis Data 11 decembrie 2013 18:01:34
Problema Deque Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#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;
}