Pagini recente » Cod sursa (job #2680145) | Istoria paginii utilizator/rolandos | Profil KawakiMeido | Match | Cod sursa (job #796650)
Cod sursa(job #796650)
#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 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){
mElement = elements[pivotPosition];
return;
}
if(pos <= smaller)
select(left, pivotPosition-1, pos);
else
select(pivotPosition+1, right, pos - (smaller+1));
}
void solve(){
random_shuffle(elements, elements+N);
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;
}