# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1202028 | Nelt | 스핑크스 (IOI24_sphinx) | C++20 | 0 ms | 0 KiB |
struct DSU {
vector<int> p;
DSU(int n): p(n) { iota(p.begin(),p.end(),0); }
int find(int x){ return p[x]==x?x:p[x]=find(p[x]); }
void unite(int a,int b){
a=find(a); b=find(b);
if(a!=b) p[b]=a;
}
};
vector<int> find_colours(int N, vector<int> X, vector<int> Y) {
int M = X.size();
DSU dsu(N);
vector<int> E(N);
// for each edge test if its endpoints share the same original colour
for(int j = 0; j < M; j++){
int u = X[j], v = Y[j];
// recolour everyone to Sphinx (colour N), except u and v keep original
fill(E.begin(), E.end(), N);
E[u] = E[v] = -1;
int comps = perform_experiment(E);
// If we see exactly 2 monochromatic components,
// u and v must have merged into one ⇒ same original colour
if(comps == 2) {
dsu.unite(u, v);
}
// else (comps == 3) they stayed separate ⇒ different colours
}
// now assign each DSU component an arbitrary label in [0..N)
vector<int> comp_id(N, -1), G(N);
int next_label = 0;
for(int i = 0; i < N; i++){
int r = dsu.find(i);
if(comp_id[r] < 0)
comp_id[r] = next_label++;
G[i] = comp_id[r];
}
return G;
}