Cod sursa(job #672124)

Utilizator popoiu.georgeGeorge Popoiu popoiu.george Data 1 februarie 2012 17:21:04
Problema Elementul majoritar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<fstream>
#include<stdlib.h>
#include<time.h>
#define inf "elmaj.in"
#define outf "elmaj.out"
#define NMax 1000001
using namespace std;

fstream f(inf, ios::in), g(outf, ios::out);

int n, v[NMax];

void read()
{
    f>>n;
    for(int i=1; i<=n; i++) f>>v[i];
}

int part(int li, int ls) {
    int i = li-1, j = ls+1, p = v[li + rand()%(ls-li+1)];

    while( 1 ) {
        do { i++; } while( v[i]<p );
        do { j--; } while( v[j]>p );
        if( i<j ) swap(v[i], v[j]);
        else return i;
    }

    return 0;
}

void qs(int li, int ls, int k) {
    if( li==ls ) return;

    int p = part(li, ls);
    int t = p-li+1;

    if( k<=t ) qs(li, p, k);
    else qs(p+1, ls, k-t);
}

void solve()
{
    srand( time(0) );
    qs(1, n, n/2);

    int x = v[n/2], nr = 0;
    for(int i=1; i<=n; i++)
        if( v[i]==x ) nr++;

    nr > n/2 ? g<<x <<" "<< nr : g<<"-1";
}

int main()
{
	read(); solve();
	f.close(); g.close();
	return 0;
}