Submission #1236791

#TimeUsernameProblemLanguageResultExecution timeMemory
1236791fv3Sphinx's Riddle (IOI24_sphinx)C++20
36 / 100
38 ms420 KiB
#include "sphinx.h"

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

#ifdef LOCAL
#include "/home/fv3/prog/debug/debug.h"
#else
#define debug(...) 42
#endif

vector<int> find_colours(int n, vector<int> u, vector<int> v) {
    const int m = int(u.size());

    vector<vector<int>> adj(n);
    for (int i = 0; i < m; i++) {
        adj[u[i]].push_back(v[i]);
        adj[v[i]].push_back(u[i]);
    }

    auto Count = [&](const 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;
    };

    vector<int> blue(n, 0), b, r;
    for (int i = 0; i < n; i++) {
        bool go_blue = true;
        for (auto node : adj[i]) {
            if (blue[node]) {
                go_blue = false;
            }
        }

        if (go_blue) {
            blue[i] = 1;
            b.push_back(i);
        } else {
            r.push_back(i);
        }
    }

    vector<int> colours(n, -1);

    // Find colour of all blue's
    auto SolveReds = [&](vector<int> &blues) {
        for (int c = 0; c < n; c++) {
            vector<int> col(n, c);
            for (int i : blues) { col[i] = -1; }

            int initial_experiment = perform_experiment(col);
            while (!blues.empty() && Count(col) != initial_experiment) {
                int lo = 0, hi = int(blues.size()) - 1;
                while (lo < hi) {
                    int mid = lo + (hi - lo) / 2;

                    for (int i : blues) { col[i] = n; };
                    for (int i = lo; i <= mid; i++) {
                        col[blues[i]] = -1;
                    }

                    int perf = perform_experiment(col), cnt = Count(col);
                    if (perf == cnt) {
                        lo = mid + 1;
                    } else {
                        hi = mid;
                    }
                }

                col[blues[lo]] = c;
                colours[blues[lo]] = c;
                blues.erase(blues.begin() + lo);
            }
        }
    };

    SolveReds(r);
    SolveReds(b);

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