Submission #1239682

#TimeUsernameProblemLanguageResultExecution timeMemory
1239682hengliaoSphinx's Riddle (IOI24_sphinx)C++20
50 / 100
699 ms996 KiB
#include "sphinx.h"
#include<bits/stdc++.h>
using namespace std;

#define F first
#define S second
#define pll pair<ll, ll>
#define vll vector<ll>
#define pb push_back

typedef int ll;

namespace{
	
	const ll mxN=255;

	ll n, m;
	// vll adj[mxN];
	vll adj2[mxN];
	bool visited[mxN];
	bool done[mxN];
	vll tep, ans;
	ll timer;
	bool adj[mxN][mxN];

	void dfs(ll cur, ll u){
		if(cur==u || visited[cur]) return;
		visited[cur]=1;
		for(ll i=0;i<n;i++){
			if(adj[cur][i]){
				if(tep[cur]==n && tep[i]==n){
					dfs(i, u);
				}
				else if(tep[cur]==-1 && tep[i]==-1 && ans[cur]==ans[i]){
					dfs(i, u);
				}
			}
		}
	}

	void dfs2(ll cur, ll a){
		if(done[cur]) return;
		done[cur]=1;
		ans[cur]=a;
		for(auto &it:adj2[cur]){
			dfs2(it, a);
		}
	}

	ll f(ll u){
		memset(visited, 0, sizeof(visited));
		ll cnt=0;
		for(ll i=0;i<n;i++){
			if(i==u) continue;
			if(!visited[i]){
				dfs(i, u);
				cnt++;
			}
		}
		return cnt;
	}

	ll ceil_div(ll a, ll b){
		return (a+b-1)/b;
	}
	
}

vector<int> find_colours(int N, vector<int> X, vector<int> Y){
	memset(done, 0, sizeof(done));
	memset(adj, 0, sizeof(adj));
	n=N;
	m=X.size();
	for(ll i=0;i<m;i++){
		adj[X[i]][Y[i]]=1;;
		adj[Y[i]][X[i]]=1;
	}
	ans=vll(n, -1);

	timer=0;

	auto qry=[&](ll u, ll tar){
		tep=vll(n, n);
		tep[u]=-1;
		for(ll i=u+1;i<n;i++){
			if(adj[u][i] && i<=tar && !done[i]){
				tep[i]=-1;
			}
		}
		if(perform_experiment(tep)==f(u)+1){
			return false;
		}
		return true;
	};

	for(ll i=n-1;i>=0;i--){
		memset(done, 0, sizeof(done));
		ans[i]=i;
		while(true){
			vll v;

			for(ll j=i+1;j<n;j++){
				if(adj[i][j] && !done[j]){
					v.pb(j);
				}
			}
			if(v.empty()) break;
			ll lef=0, rig=(ll) v.size()-1;
			ll good=-1;
			if(!qry(i, v[rig])){
				break;
			}
			while(lef<=rig){
				ll mid=(lef+rig)/2;
				if(qry(i, v[mid])){
					good=mid;
					rig=mid-1;
				}
				else{
					lef=mid+1;
				}
			}
			assert(good!=-1);
			dfs2(v[good], ans[i]);
			adj2[i].pb(v[good]);
			adj2[v[good]].pb(i);
		}
		
	}

	// cout<<qry(1, 0)<<'\n';

	return ans;
}
#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...