Cod sursa(job #2223065)

Utilizator claudiu.gatinaFMI Claudiu Gatina claudiu.gatina Data 19 iulie 2018 00:52:29
Problema Elementul majoritar Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <iostream>
#include <vector>
#include <map>
#include <cstdio>

using namespace std;

// o idee incredibil de proasta, care schimba complexitatea in rau, dar cine stie...

class Frequency
{
public:
    int frequency;
    int number;
    Frequency(int n, int f):
    number(n),
    frequency(f)
    {};
};

class FrequencyHeap
{
  vector<Frequency> m_heap;
  map<int, int> m_indices;
public:
  FrequencyHeap()
  {
    m_heap.push_back(Frequency(0, 1000001));
  }

  bool empty()
  {
    return m_heap.size() == 1;
  }

  void insert(int number)
  {
      int indice = m_indices[number];
      if(indice == 0)
      {
          m_indices[number] = m_heap.size();
          m_heap.push_back(Frequency(number, 1));
      }
      else
      {
          ++m_heap[m_indices[number]].frequency;
          while(m_heap[indice >> 1].frequency < m_heap[indice].frequency)
          {
              Frequency aux(m_heap[indice]);
              m_heap[indice] = m_heap[indice >> 1];
              m_indices[m_heap[indice >> 1].number] = indice;
              m_heap[indice >>= 1] = aux;
              m_indices[number] = indice;
          }
      }
  }

  int mostFrequent()
  {
      return m_heap[1].number;
  }

  int mostFrequentNumber()
  {
      return m_heap[1].frequency;
  }
};

int main()
{
    freopen("elmaj.in", "r", stdin);
    freopen("elmaj.out", "w", stdout);
    int n;
    FrequencyHeap f;
    scanf("%d", &n);
    for(int i = 0; i < n; ++i)
    {
        int x;
        scanf("%d", &x);
        f.insert(x);
    }
    if(f.mostFrequentNumber() >= n / 2 + 1)
        printf("%d %d", f.mostFrequent(), f.mostFrequentNumber());
    else
        printf("-1");
    return 0;
}