Submission #1124796

#TimeUsernameProblemLanguageResultExecution timeMemory
1124796Mousa_AboubakerSphinx's Riddle (IOI24_sphinx)C++20
18 / 100
5 ms468 KiB
#include "sphinx.h"
#include <bits/stdc++.h>
using namespace std;

vector<int> find_colours(int N, vector<int> X, vector<int> Y)
{
	int n = N, m = (int)X.size();
	vector<int> x = X, y = Y;
	vector<int> par(n), sz(n, 1);
	iota(par.begin(), par.end(), 0);
	auto find = [&](auto self, int u) -> int
	{
		return par[u] = (par[u] == u ? u : self(self, par[u]));
	};
	auto unite = [&](int u, int v) -> bool
	{
		u = find(find, u);
		v = find(find, v);
		if(u == v)
			return false;
		if(sz[u] > sz[v])
			swap(u, v);
		sz[v] += sz[u];
		par[u] = v;
		return true;
	};
	vector adj(n, vector<int>());
	for(int i = 0; i < m; i++)
	{
		adj[x[i]].push_back(y[i]);
		adj[y[i]].push_back(x[i]);
	}
	for(auto &i: adj)
		sort(i.begin(), i.end());
	vector<bool> vis(n, false);
	vector<int> e(n, n);
	vector<int> res(n, 0);
	int curr = -1;
	int cnt = 1;
	int lst = 0;
	/*queue<tuple<int, int, int, int>> q;
	q.push({0, -1, -1, 1});
	int ss = 0;
	while(not q.empty())
	{
		auto [u, p, m, c] = q.front();
		q.pop();

		if(vis[u])
			continue;
		ss++;
		vis[u] = true;
		e[u] = -1;
		int x = perform_experiment(e);
		if(ss == n)
		{
			if(x == c - 1)
			{
				res[u] = m;
				unite(u, p);
			}
			else
			{
				res[u] = ++m;
				c++;
			}
			break;
		}
		if(x == c)
		{
			res[u] = m;
			unite(u, p);
		}
		else
		{
			res[u] = ++m;
			c++;
		}
		for(auto i: adj[u])
		{
			if(vis[i])
				continue;
			q.push({i, u, m, c});
		}
	}
	return res;*/
	int ss = 0;
	auto dfs = [&](auto self, int u, int m, int c) -> void
	{
		vis[u] = true;
		e[u] = -1;
		int x = perform_experiment(e);
		ss++;
		if(ss == n)
		{
			if(x == cnt - 1)
			{
				//res[u] = m;
				unite(lst, u);
			}
			//else
				//res[u] = ++m;
			return;
		}
		if(x == cnt)
		{
			//res[u] = m;
			unite(lst, u);
		}
		else
		{
			//res[u] = ++m;
			cnt++;
		}
		for(auto i: adj[u])
		{
			if(vis[i])
				continue;
			lst = u;
			self(self, i, m, c);
		}
	};
	dfs(dfs, 0, -1, 1);
	set<int> st;
	map<int, int> mp;
	curr = 0;
	for(int i = 0; i < n; i++)
	{
		if(st.find(find(find, i)) == st.end())
		{
			st.insert(find(find, i));
			mp[find(find, i)] = res[i] = curr++;
		}
		else
		{
			res[i] = mp[find(find, i)];
		}
	}
	return res;
	/*for(int i = 0; i < n; i++)
	{
		e.assign(n, -1);
		for(int j = 0; j < n; j++)
		{
			for(int k = 0; k < n; k++)
			{
				if(k == i)
					continue;
				e[k] = j;
			}
			int m = perform_experiment(e);
			if(m == 1)
			{
				res[i] = j;
				break;
			}
		}
	}
	return res;*/
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...