Submission #1219828

#TimeUsernameProblemLanguageResultExecution timeMemory
1219828nicolo_010스핑크스 (IOI24_sphinx)C++20
1.50 / 100
30 ms464 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] && x != u && neg[x] == -2) dfs(x, u, neg);
	}
}

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

int count(v<int> &cmp, int u) {
	int n = cmp.size();
	vis.assign(n, false);
	cnt = 0;
	rep(i, 0, n) {
		if (vis[i] == false && cmp[i] == -2) {
			cnt++;
			dfs(i, u, cmp);
		}
	}
	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++;
	trees.push_back(0);
	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;
		int comp = count(cmp, i);
		v<int> query(n);
		rep(i, 0, n) {
			if (cmp[i] == -2) query[i] = n;
			else query[i] = -1;
		}
		//for (auto x : query) cout << x << endl;
		int ans = perform_experiment(query);
		if (ans == comp + trees.size()) {
			cmp[i] = bs(i, trees, cmp);
		}
		else {
			cmp[i] = id;
			trees.push_back(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...