Cod sursa(job #2291488)

Utilizator ifrimencoAlexandru Ifrimenco ifrimenco Data 28 noiembrie 2018 09:17:38
Problema Elementul majoritar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <random>
using namespace std;

int n, v[1000005];

ifstream fin("elmaj.in");
ofstream fout("elmaj.out");

int alegere_pivot(int st, int dr) {
    int random = st + rand() % (dr - st);
    //cout << random << " ";
    return random;
}

int partitie (int st, int dr) {
    //cout << v[dr] << ": ";
    int pivot = v[dr];
    int i = st, j = dr - 1;
    while (i <= j) {
        if (v[i] >= pivot && v[j] < pivot) swap(v[i], v[j]);
        if (v[i] < pivot) i++;
        if (v[j] >= pivot) j--;
    }
    swap(v[i], v[dr]);
    //for (int i = 0; i < n; ++i) cout << v[i] << " ";
    //cout << "\n";
    return i;
}

int quickselect(int st, int dr, int k) {
    if (st >= dr) return st;
    int pivot = alegere_pivot(st, dr);
    swap(v[pivot], v[dr]);
    int ret = partitie(st, dr);
    if (ret > k) return quickselect(st, ret - 1, k);
    if (ret < k) return quickselect(ret + 1, dr, k);
    return ret;
}

int main()
{
    int n;
    fin >> n; int poz = n / 2;
    poz--;
    for (int i = 0; i < n; ++i) {
        fin >> v[i];
    }
    quickselect(0, n - 1, poz);
    int nr = 0;
    for (int i = 0; i < n; ++i) {
        if (v[i] == v[poz]) nr++;
    }
    if (nr < n /2) {
        fout << -1;
        return 0;
    }
    fout << v[poz] << " " << nr;
    return 0;
}