Submission #1220235

#TimeUsernameProblemLanguageResultExecution timeMemory
1220235lukasuliashviliEaster Eggs (info1cup17_eastereggs)C++20
0 / 100
3 ms504 KiB
#include <bits/stdc++.h>
using namespace std;

int query(vector<int> nodes); // Provided externally

vector<vector<int>> g;
vector<bool> used;
vector<int> subtree;

void collect(int u, int p) {
    subtree.push_back(u);
    used[u] = true;
    for (int v : g[u]) {
        if (!used[v] && v != p) {
            collect(v, u);
        }
    }
}

int findEgg(int n, vector<pair<int, int>> edges) {
    g.assign(n + 1, {});
    used.assign(n + 1, false);

    for (auto [u, v] : edges) {
        g[u].push_back(v);
        g[v].push_back(u);
    }

    vector<int> curr;
    curr.push_back(1);

    // Expand to full connected component
    used.assign(n + 1, false);
    subtree.clear();
    collect(1, -1);

    curr = subtree;

    while (curr.size() > 1) {
        // Try to extract a connected component of roughly half the size
        vector<bool> mark(n + 1, false);
        for (int x : curr) mark[x] = true;

        used.assign(n + 1, false);
        vector<int> half;

        for (int u : curr) {
            if (!used[u]) {
                subtree.clear();
                collect(u, -1);
                if (subtree.size() <= curr.size() / 2) {
                    for (int x : subtree) half.push_back(x);
                    if (half.size() >= curr.size() / 2) break;
                }
            }
        }

        // if half not big enough, add nodes from current to make it big and connected
        if (half.size() < curr.size() / 2) {
            for (int x : curr) {
                if (find(half.begin(), half.end(), x) == half.end()) {
                    half.push_back(x);
                    if (half.size() >= curr.size() / 2) break;
                }
            }
        }

        if (query(half)) {
            curr = half;
        } else {
            vector<int> other;
            for (int x : curr) {
                if (find(half.begin(), half.end(), x) == half.end()) {
                    other.push_back(x);
                }
            }
            curr = other;
        }
    }

    return curr[0];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...