Cod sursa(job #1009934)

Utilizator hevelebalazshevele balazs hevelebalazs Data 14 octombrie 2013 00:03:34
Problema Elementul majoritar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define fr(i,a,b) for(int i=a;i<b;++i)
#define N 3000000
int a[N];
int rand(int i,int j){return i+rand()%(j-i);}
int kth(int l,int r,int k){
    if(l==r)return a[l];
    int l1=l-1,r1=r+1,x=a[rand(l,r)];
    while(1){
        do{--r1;}while(a[r1]>x);
        do{++l1;}while(a[l1]<x);
        if(l1<r1) a[l1]^=a[r1]^=a[l1]^=a[r1];else break;
        }
    if(r1>=k) return kth(l,r1,k); return kth(r1+1,r,k);
    }
int main(){
    freopen("elmaj.in","r",stdin);
    freopen("elmaj.out","w",stdout);
    srand(time(NULL));
    int n;
    scanf("%i",&n);
    fr(i,0,n)scanf("%i",a+i);
    int k=kth(0,n-1,(n-1)/2);
    int s=0;
    fr(i,0,n)if(a[i]==k)++s;
    if(s>=n/2)printf("%i %i",k,s);
    else printf("-1");
    return 0;
    }