| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1283043 | MMihalev | Sphinx's Riddle (IOI24_sphinx) | C++20 | 0 ms | 0 KiB |
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#include "sphinx.h"
using namespace std;
const int MAX_N=252;
int n;
vector<int>g[MAX_N];
vector<int>exp,ans;
int query[2][MAX_N][MAX_N];
bool used[MAX_N];
int depth[MAX_N];
void dfs(int u)
{
used[u]=1;
for(int v:g[u])
{
if(used[v])continue;
depth[v]=depth[u]+1;
dfs(v);
}
}
bool check(int l,int r,bool wh,vector<int>ids,int col)
{
bool full=1;
for(int id:ids)
{
if(ans[id]==-1)full=0;
}
if(full)return 0;
if(ids.size()==1)
{
for(int i=0;i<n;i++)
{
exp[i]=col;
}
exp[ids[0]]=-1;
if(perform_experiment(exp)==1)return 1;
return 0;
}
for(int i=0;i<n;i++)exp[i]=col;
for(int id:ids)
{
exp[id]=-1;
}
int cnt=perform_experiment(exp);
if(query[wh][l][r]==-1)
{
for(int i=0;i<n;i++)exp[i]=n;
for(int id:ids)
{
exp[id]=-1;
}
query[wh][l][r]=perform_experiment(exp);
}
if(cnt<query[wh][l][r])
}
std::vector<int> find_colours(int N, std::vector<int> X, std::vector<int> Y)
{
n=N;
exp.resize(n);ans.resize(n);
for(int i=0;i<n;i++)ans[i]=-1;
memset(query,-1,sizeof(query));
for(int i=0;i<X.size();i++)
{
g[X[i]].push_back(Y[i]);
g[Y[i]].push_back(X[i]);
}
dfs(0);
vector<int>idsodd,idseven;
for(int i=0;i<n;i++)
{
if(depth[i]%2==0)
{
idseven.push_back(i);
}
else idsodd.push_back(i);
}
while(1);
///
for(int col=0;col<n;col++)
{
while(1)
{
bool full=1;
for(int id:idseven)
{
if(ans[id]==-1)full=0;
}
if(full)break;
if(check(0,idseven.size()-1,0,idseven,col))rec(0,idseven,col);
}
while(1)
{
bool full=1;
for(int id:idsodd)
{
if(ans[id]==-1)full=0;
}
if(full)break;
if(check(0,idsodd.size()-1,1,idsodd,col))rec(1,idsodd,col);
}
}
return ans;
}
