Cod sursa(job #796878)

Utilizator razvan.popaPopa Razvan razvan.popa Data 12 octombrie 2012 20:36:17
Problema Elementul majoritar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <fstream>
#include <string>
#include <math.h>
#include <vector>
#include <stack>
#include <queue>
#include <stdlib.h>
#include <time.h>
#include <algorithm>

#define infile "elmaj.in"
#define outfile "elmaj.out"

#define n_max 1000000
#define INF 1 << 30
#define MOD 666013

#define ll long long
#define ull unsigned long long

#define pb push_back
#define mkp make_pair
#define pii pair<int, int>
#define FOR(g) \
    for(vector<int>::iterator it=g.begin(); it!=g.end(); ++it)
#define nxt (*it)

#define min(x,y) x<y ? x : y
#define max(x,y) x>y ? x : y
using namespace std;

int N;

int elements[n_max];

int mElement = -1;

int numbApparitions = 0;

void read(){
    ifstream fin(infile);

    fin >> N;

    for(int i=0; i<N; ++i)
        fin >> elements[i];

    fin.close();
}


int partition(int left, int right){
    swap(elements[left], elements[rand()%(right - left + 1) + left]);

    int l = left;
    int r = right + 1;
    int v = elements[left];

    while(true){
        while(l < right && elements[++l] < v);
        while(r > left  && elements[--r] > v);

        if(l >= r)
           break;

        swap(elements[l], elements[r]);
    }
    swap(elements[left], elements[r]);

    return r;
}

int select(int left, int right, int pos){
    int pivotPosition = partition(left, right);

    int smaller = pivotPosition - left;

    if(smaller + 1 > pos)
       return select(left, pivotPosition-1, pos);
    else if(smaller + 1 < pos)
       return select(pivotPosition + 1, right, pos - (smaller + 1));

    return elements[pivotPosition];
}


void solve(){
    srand ( time(NULL) );

    mElement = select(0, N-1, N/2+1);

    for(int i=0; i<N; ++i)
       numbApparitions += elements[i] == mElement;
}

void print(){
    ofstream fout(outfile);

    if(numbApparitions >= N/2+1)
       fout << mElement << " " << numbApparitions << '\n';
    else
       fout << -1 << '\n';

    fout.close();
}


int main(){

    read();
    solve();
    print();

    return 0;
}