Cod sursa(job #2911469)

Utilizator matthriscuMatt . matthriscu Data 29 iunie 2022 20:18:57
Problema Elementul majoritar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <bits/stdc++.h>
using namespace std;

#define NMAX 1000005
#define problem "elmaj"

pair<int, int> solve(int left, int right, int *v) {
	if (left == right)
		return {v[left], 1};
	
	int mid = left + (right - left) / 2;

	pair<int, int> left_ans = solve(left, mid, v), right_ans = solve(mid + 1, right, v);
	
	if (left_ans == right_ans)
		return {left_ans.first, left_ans.second + right_ans.second};
	
	int cnt_left = 0, cnt_right = 0;
	for (int i = left; i <= right; ++i) {
		cnt_left += v[i] == left_ans.first;
		cnt_right += v[i] == right_ans.first;
	}
	
	return cnt_left > cnt_right ? make_pair(left_ans.first, cnt_left) : make_pair(right_ans.first, cnt_right);
}

class InParser {
private:
	FILE *fin;
	char *buff;
	int sp;
 
	char read_ch() {
		++sp;
		if (sp == 4096) {
			sp = 0;
			fread(buff, 1, 4096, fin);
		}
		return buff[sp];
	}
 
public:
	InParser(const char* nume) {
		fin = fopen(nume, "r");
		buff = new char[4096]();
		sp = 4095;
	}
	
	InParser& operator >> (int &n) {
		char c;
		while (!isdigit(c = read_ch()) && c != '-');
		int sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		} else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}
	
	InParser& operator >> (long long &n) {
		char c;
		n = 0;
		while (!isdigit(c = read_ch()) && c != '-');
		long long sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		} else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}
};

int main()
{
	InParser fin(problem ".in");
	freopen(problem ".out", "w", stdout);

	int n, v[NMAX];
	fin >> n;

	for (int i = 0; i < n; ++i)
		fin >> v[i];

	pair<int, int> ans = solve(0, n - 1, v);

	if (ans.second <= n / 2) {
		puts("-1");
		exit(0);
	}

	printf("%d %d\n", ans.first, ans.second);
}