제출 #1220004

#제출 시각아이디문제언어결과실행 시간메모리
1220004nicolo_010스핑크스 (IOI24_sphinx)C++20
28.50 / 100
115 ms1208 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;
	int aux = neg.size();
	for (auto x : adj[n]) {
		if (!vis[x] && x != u && neg[x] == aux) dfs(x, u, neg);
	}
}

int bs(int u, v<int> trees, v<int> &cmp) {
	int l = 0, r = trees.size()-1;
	int ans;
	int n = cmp.size();
	while (l <= r) {
		map<int, int> mp;
		int m = (l+r)/2;
		rep(i, m+1, (int)trees.size()) {
			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;
		}
		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 = m+1;
		int compon = perform_experiment(query);
		//cout << m << " " << coloured << " " << cnt << " " << compon << endl;
		if (compon == cnt+coloured) {
			ans = trees[m];
			r = m-1;
		}
		else if (compon > cnt+coloured) {
			l = 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++;
	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;
		v<int> query = cmp;
		rep(j, 0, n) {
			if (cmp[j] == -2) query[j] = n;
			else query[j] = -1;
		}
		int comp = count(query, i);
		//if (i == 8) for (auto x : query) cout << x << endl;
		int ans = perform_experiment(query);
		//if (i == 8) cout << comp << " " << ans << " " << trees.size() << endl;
		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...