| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1363820 | activedeltorre | Sphinx's Riddle (IOI24_sphinx) | C++20 | 0 ms | 0 KiB |
#include "sphinx.h"
#include <cassert>
#include <cstdio>
#include <queue>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
namespace
{
const int CALLS_CNT_LIMIT = 2750;
int calls_cnt;
int N, M;
std::vector<int> C;
std::vector<int> X, Y;
std::vector<std::vector<int>> adj;
void quit(const char* message)
{
printf("%s\n", message);
exit(0);
}
int count_components(const std::vector<int>& S)
{
int components_cnt = 0;
std::vector<bool> vis(N, false);
for (int i = 0; i < N; i++)
{
if (vis[i])
continue;
components_cnt++;
std::queue<int> q;
vis[i] = true;
q.push(i);
while (!q.empty())
{
int cur = q.front();
q.pop();
for (int nxt : adj[cur])
if (!vis[nxt] && S[nxt] == S[cur])
{
vis[nxt] = true;
q.push(nxt);
}
}
}
return components_cnt;
}
} // namespace
int perform_experiment(std::vector<int> E)
{
calls_cnt++;
if (calls_cnt > CALLS_CNT_LIMIT)
quit("Too many calls");
if ((int)E.size() != N)
quit("Invalid argument");
for (int i = 0; i < N; i++)
if (!(-1 <= E[i] && E[i] <= N))
quit("Invalid argument");
std::vector<int> S(N);
for (int i = 0; i < N; i++)
S[i] = (E[i] == -1 ? C[i] : E[i]);
return count_components(S);
}
vector<int>make(int n,int poz,int val)
{
std::vector<int> E(n);
for(int i=0;i<n;i++)
{
E[i]=val;
}
E[poz]=-1;
return E;
}
std::vector<int> find_colours(int N, std::vector<int> X, std::vector<int> Y)
{
std::vector<int> E(N, -1);
vector<int>rasp(N);
int n=N;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
int rez=perform_experiment(make(N,i,j));
if(rez==1)
{
rasp[i]=j;
}
}
}
return rasp;
}