Submission #1200523

#TimeUsernameProblemLanguageResultExecution timeMemory
1200523ansoriSphinx's Riddle (IOI24_sphinx)C++20
28.50 / 100
160 ms1196 KiB
#include "sphinx.h"
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int msz = 256;
int perform_experiment(vector<int> E);
vector<vector<int>> comp;
vector<int> g[msz] , cmp(msz , -1);
int n , color[msz];
vector<bool> w;
void dfs(int v){
	w[v] = 1;
	for(auto to : g[v]){
		if((! w[to]) and color[v] == color[to]){
			dfs(to);
		}
	}
}
int expected(int l , int r , int p){
	w = vector<bool> (n , 0);
	for(int i = 0;i < n; ++ i){
		if(cmp[i] >= l and cmp[i] <= r) color[i] = cmp[i];
		else color[i] = n;
	}
	color[p] = color[g[p][0]];
	int sm = 0;
	for(int i = 0;i < n; ++ i){
		if(! w[i]){
			w[i] = 1;
			sm ++;
			dfs(i);
		}
	}
	return sm;
}
bool ask(int l , int r , int p){
	vector<int> qu(n , n);
	qu[p] = -1;
	for(int j = l;j <= r; ++ j){
		for(auto to : comp[j]){
			qu[to] = -1;
		}
	}
	int cnt = perform_experiment(qu);
	//cout << l << ' ' << r << ' ' << expected(l , r , p) << ' ' << cnt << '\n';
	if(expected(l , r , p) == cnt) return true;
	return false;
}
vector<int> find_colours(int N, std::vector<int> x, std::vector<int> y) {
	int m = x.size();
	n = N;
	for(int i = 0;i < m; ++ i){
		g[x[i]].push_back(y[i]);
		g[y[i]].push_back(x[i]);
	}
	comp.push_back({0});
	cmp[0] = 0;
	//ask(0 , 0 , 1);
	for(int i = 1;i < n; ++ i){
		if(! ask(0 , comp.size() - 1 , i)){
			comp.push_back({i});
			cmp[i] = comp.size() - 1;
			continue ;
		}
		int l = 0;
		int r = comp.size();
		while(l + 1 < r){
			int mid = (l + r) / 2;
			if(ask(mid , r - 1 , i)) l = mid;
			else r = mid;
		}
		comp[l].push_back(i);
		cmp[i] = l;
	}
	vector<int> G(n);
	for(int i = 0;i < comp.size(); ++ i){
		for(auto to : comp[i]){
			G[to] = i;
		}
	}
	return G;
}
#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...