Submission #1332315

#TimeUsernameProblemLanguageResultExecution timeMemory
1332315MisterReaperChameleon's Love (JOI20_chameleon)C++20
100 / 100
32 ms604 KiB
#include "chameleon.h"
#include <bits/stdc++.h>

#ifdef DEBUG
    #include "../debug.h"
#else
    #define debug(...) void(23)
#endif

namespace {
    constexpr int max_Q = int(20000);
    std::vector<int> join(std::vector<int> a, int x) {
        a.emplace_back(x);
        return a;
    }
    std::vector<int> join(std::vector<int> a, std::vector<int> x) {
        a.insert(a.end(), x.begin(), x.end());
        return a;
    }
    void erase(std::vector<int>& a, int x) {
        if (std::count(a.begin(), a.end(), x)) {
            a.erase(std::find(a.begin(), a.end(), x));
        }
    }
    int cntq = 0;
    int ask(std::vector<int> x) {
        assert(cntq + 1 <= max_Q);
        ++cntq;
        return Query(x);
    }
}  // namespace

void Solve(int N) {
    std::vector<std::vector<int>> adj(2 * N + 1);
    std::vector<int> col(2 * N + 1);

    auto dfs = [&](auto&& self, int v) -> void {
        for (auto u : adj[v]) {
            if (col[u] == -1) {
                col[u] = !col[v];
                self(self, u);
            } else {
                assert(col[u] == !col[v]);
            }
        }
    };

    for (int i = 1; i <= 2 * N; ++i) {
        col.assign(2 * N + 1, -1);
        std::vector<int> g[2];
        for (int j = 1; j < i; ++j) {
            if (col[j] == -1) {
                col[j] = 0;
                dfs(dfs, j);
            }
            g[col[j]].emplace_back(j);
        }
        for (auto oth : g) {
            for (auto j : adj[i]) {
                erase(oth, j);
            }
            while (ask(join(oth, i)) != int(oth.size()) + 1) {
                auto v = oth;
                while (v.size() > 1) {
                    std::vector<int> lhs(v.begin(), v.begin() + v.size() / 2);
                    std::vector<int> rhs(v.begin() + v.size() / 2, v.end());
                    if (ask(join(lhs, i)) != int(lhs.size()) + 1) {
                        v = lhs;
                    } else {
                        v = rhs;
                    }
                }
                int x = v[0];
                debug(i, x, cntq);
                adj[i].emplace_back(x);
                adj[x].emplace_back(i);
                oth.erase(std::find(oth.begin(), oth.end(), x));
            }
        }
    }

    std::vector<std::vector<int>> res = adj;

    for (int i = 1; i <= 2 * N; ++i) {
        debug(i, adj[i]);
        if (int(adj[i].size()) == 3) {
            int x = adj[i][0];
            int y = adj[i][1];
            int z = adj[i][2];
            if (ask({x, y, i}) == 1) {
                erase(res[i], z);
                erase(res[z], i);
            } else if (ask({x, z, i}) == 1) {
                erase(res[i], y);
                erase(res[y], i);
            } else {
                erase(res[i], x);
                erase(res[x], i);
            }
        }
    }

    debug(res);

    for (int i = 1; i <= 2 * N; ++i) {
        assert(int(res[i].size()) == 1);
        int x = res[i][0];
        if (x < i) {
            Answer(x, i);
        }
    }
}
#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...