Cod sursa(job #1167137)

Utilizator Stefanescu_MihaiStefanescu Mihai-Nicolae Stefanescu_Mihai Data 4 aprilie 2014 14:00:29
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <cstdlib>
#include <ctime>

using namespace std;

#define MaxN 3000100

int v[MaxN];

int getpivot( int lo, int hi )
{
    int i;
    int mid = lo + ( rand() % ( hi - lo + 1 ) );
    int pivot = v[mid];

    int dummy;

    v[mid] = v[hi];

    int indexpivot = lo;

    for ( i = lo; i < hi; ++i )
    {
        if ( v[i] < pivot )
        {
            if ( i != indexpivot )
            {
                dummy = v[i];
                v[i] = v[indexpivot];
                v[indexpivot++] = dummy;
            }
            else
                ++indexpivot;
        }
    }

    v[hi] = v[indexpivot];
    v[indexpivot] = pivot;

    return indexpivot;
}

int quickselect( int lo, int hi, int k )
{
    if ( lo == hi )
        return v[lo];

    int sorted = getpivot( lo, hi );
    int localsorted = sorted - lo + 1;

    if ( localsorted == k )
        return sorted;

    if ( localsorted > k )
        return quickselect( lo, sorted - 1, k );

    return quickselect( sorted + 1, hi, k - localsorted );
}

int main()
{
    ifstream f1( "elmaj.in" );
    ofstream f2( "elmaj.out" );

    srand( time( NULL ) );

    int i, n;

    f1 >> n;

    for ( i = 1; i <= n; ++i )
        f1 >> v[i];

    int mid = v[ quickselect( 1, n, n / 2 ) ];
    int count = 0;

    for ( i = 1; i <= n; ++i )
    {
        if ( v[i] == mid )
            ++count;
    }

    if ( count >= n / 2 + 1 )
        f2 << mid << ' ' << count << '\n';
    else
        f2 << "-1\n";

    f1.close();
    f2.close();

    return 0;
}