Submission #1219883

#TimeUsernameProblemLanguageResultExecution timeMemory
1219883nicolo_010Sphinx's Riddle (IOI24_sphinx)C++20
28.50 / 100
124 ms1204 KiB
#include <bits/stdc++.h>
#include "sphinx.h"
using namespace std;
template <typename T>
using v = vector<T>;
using pii = pair<int, int>;
using ll = long long;
#define rep(i, k, n) for (int i = k; i < n; i++)

int cnt;
v<bool> vis;
v<v<int>> adj;

void dfs(int n, int u, v<int> &neg) {
	vis[n] = true;
	for (auto x : adj[n]) {
		if (!vis[x] && neg[x] == neg[n] && x != u) dfs(x, u, neg);
	}
}

int bs(int u, int am, v<int> &cmp) {
	int l = 0, r = am-1;
	int ans;
	int n = cmp.size();
	while (l <= r) {
		map<int, int> mp;
		int m = (l+r)/2;
		rep(i, 0, m) {
			mp[i]++;
		}
		v<int> query = cmp;
		rep(i, 0, n) {
			if (mp.count(cmp[i]) || cmp[i] == -2) query[i] = n;
			else query[i] = -1;
		}
		query[u] = -1;
		cnt = 0;
		vis.assign(n, false);
		rep(i, 0, n) {
			if (query[i] == n && vis[i] == false) {
				cnt++;
				dfs(i, u, query);
			}
		}
		int coloured = am-(m);
		int compon = perform_experiment(query);
		if (compon == cnt+coloured) {
			ans = m;
			l = m+1;
		}
		else {
			r = m-1;
		}
	}
	return ans;
}

int count(v<int> &query, int u) {
	int n = query.size();
	vis.assign(n, false);
	cnt = 0;
	rep(i, 0, n) {
		if (vis[i] == false && query[i] == n) {
			//if (u == 8) cout << i << " " << cnt << endl;
			cnt++;
			dfs(i, u, query);
		}
	}
	return cnt;
}

v<int> find_colours(int N, v<int> X, v<int> Y) {
	int n = N;
	v<int> trees;
	int id = 0;
	v<int> cmp(n, -2);
	cmp[0] = 0;
	id++;
	adj.resize(n);
	int m = X.size();
	rep(i, 0, m) {
		int a = X[i], b = Y[i];
		adj[a].push_back(b);
		adj[b].push_back(a);
	}
	rep(i, 1, n) {
		cmp[i] = -1;
		v<int> query = cmp;
		rep(j, 0, n) {
			if (cmp[j] == -2) query[j] = n;
			else query[j] = -1;
		}
		query[i] = -1;
		int comp = count(query, i);
		//if (i == 8) for (auto x : query) cout << x << endl;
		int ans = perform_experiment(query);
		//cout << comp << " " << ans << endl;
		if (ans == comp + id) {
			cmp[i] = bs(i, id, cmp);
		}
		else {
			cmp[i] = id;
			id++;
		}
	}
	return cmp;
}
#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...