Submission #162579

#TimeUsernameProblemLanguageResultExecution timeMemory
162579cerberusLokahian Relics (FXCUP4_lokahia)C++17
100 / 100
3 ms632 KiB
/* cerberus97 - Hanit Banga */

#include <iostream>
#include <iomanip>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>
#include "lokahia.h"

using namespace std;

#define pb push_back
#define fast_cin() ios_base::sync_with_stdio(false); cin.tie(NULL)

typedef long long ll;
typedef long double ld;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;

const int N = 2e2 + 10;

int par[N], sz[N];

int get_root(int u);
void merge(int u, int v);
int ask(int u, int v);

int FindBase(int n) {
	for (int i = 0; i < n; ++i) {
		par[i] = i;
		sz[i] = 1;
	}
	int u = -1, ctr = 0;
	for (int i = 0; i < n; ++i) {
		if (ctr == 0) {
			u = i;
			ctr = 1;
		} else {
			int l = ask(u, i);
			if (l == -1) {
				--ctr;
			} else {
				++ctr;
				merge(u, l);
				merge(i, l);
			}
		}
	}
	for (int i = 0; i < n; ++i) {
		if (par[i] == i) {
			int v = ask(u, i);
			if (v != -1) {
				merge(u, v);
				merge(i, v);
			}
		}
	}
	u = get_root(u);
	if (sz[u] > n / 2) {
		return u;
	} else {
		return -1;
	}
}

int get_root(int u) {
	if (par[u] != u) {
		par[u] = get_root(par[u]);
	}
	return par[u];
}

void merge(int u, int v) {
	u = get_root(u);
	v = get_root(v);
	if (u != v) {
		par[u] = v;
		sz[v] += sz[u];
	}
}

int ask(int u, int v) {
	u = get_root(u);
	v = get_root(v);
	if (u == v) {
		return u;
	} else {
		return CollectRelics(u, v);
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...