Pagini recente » Cod sursa (job #3283940) | Profil Luncasu_Victor | Profil DRAGOSH | Profil Luncasu_Victor | Cod sursa (job #796640)
Cod sursa(job #796640)
#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;
}