Cod sursa(job #796640)

Utilizator razvan.popaPopa Razvan razvan.popa Data 11 octombrie 2012 23:29:09
Problema Elementul majoritar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 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;

ull 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){
    int p = rand() % (right - left+1) + left;
    swap(elements[p], elements[left]);

    int v = elements[left];

    int index = left;
    int lt = left;
    int gt = right;

    while(index <= gt){
        if(elements[index] < v)
           swap(elements[lt ++], elements[index ++]);
        else if(elements[index] > v)
           swap(elements[index], elements[gt--]);
        else
           index ++;
    }
    return gt;
}

void select(int left, int right, int pos){
    if(left > right)
       return;

    int pivotPosition = partition(left, right);

    int smaller = pivotPosition - left;

    if(smaller + 1 > pos)
       select(left, pivotPosition-1, pos);
    else if(smaller + 1 < pos)
       select(pivotPosition, right, pos - smaller);
    else
       mElement = elements[pivotPosition];
}


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

    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;
}