Submission #1210524

#TimeUsernameProblemLanguageResultExecution timeMemory
1210524Mousa_AboubakerSphinx's Riddle (IOI24_sphinx)C++20
0 / 100
0 ms412 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 findd = [&](auto self, int u) -> int
	{
		return par[u] = (par[u] == u ? u : self(self, par[u]));
	};
	auto unite = [&](int u, int v) -> bool
	{
		u = findd(findd, u);
		v = findd(findd, 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(int i = 0; i < n; i++)
	{
		int l = 0, r = adj[i].size() - 1, ans = -1;
		while(l <= r)
		{
			int md = (l + r) / 2;
			vector<int> e(n, N);
			for(int j = l; j <= md; j++)
				e[adj[i][j]] = -1;
			int cnt = perform_experiment(e);
			e[i] = -1;
			int cnt2 = perform_experiment(e);
			if(cnt == cnt2 and l == md)
			{
				unite(i, adj[i][md]);
			}
			if(n == 2 and cnt2 == 1)
			{
				unite(i, adj[i][md]);
			}
			if(cnt2 == cnt)
			{
				r = md - 1;
			}
			else
			{
				l = md + 1;
			}
		}
		for(int j: adj[i])
			adj[j].erase(find(adj[j].begin(), adj[j].end(), i));
	}
	set<int> st;
	for(int i= 0; i < n; i++)
		st.insert(findd(findd, i));
	int j =0;
	map<int, int> mp;
	for(auto i: st)
	{
		mp[i] = j++;
	}
	vector<int> res(n);
	for(int i= 0; i < n; i++)
		res[i] = mp[findd(findd, i)];
	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...