Submission #1220251

#TimeUsernameProblemLanguageResultExecution timeMemory
1220251takoshanavaEaster Eggs (info1cup17_eastereggs)C++20
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
using namespace std;

int query(const vector<int>& nodes);

vector<vector<int>> g;
vector<bool> in_remaining;
vector<int> sz;

int dfs_size(int u, int p) {
    sz[u] = 1;
    for (int v : g[u]) {
        if (v != p && in_remaining[v]) {
            sz[u] += dfs_size(v, u);
        }
    }
    return sz[u];
}

int find_centroid(int u, int p, int total) {
    for (int v : g[u]) {
        if (v != p && in_remaining[v] && sz[v] > total / 2) {
            return find_centroid(v, u, total);
        }
    }
    return u;
}

void collect_nodes(int u, int p, vector<int>& comp) {
    comp.push_back(u);
    for (int v : g[u]) {
        if (v != p && in_remaining[v]) {
            collect_nodes(v, u, comp);
        }
    }
}

int findEgg(int n, vector<pair<int,int>> edges) {
    g.assign(n + 1, {});
    for (auto [u, v] : edges) {
        g[u].push_back(v);
        g[v].push_back(u);
    }

    in_remaining.assign(n + 1, true);
    sz.assign(n + 1, 0);

    int remaining_count = n;

    while (remaining_count > 1) {
        int start = -1;
        for (int i = 1; i <= n; i++) {
            if (in_remaining[i]) {
                start = i;
                break;
            }
        }
        if (start == -1) break; 

        int total = dfs_size(start, 0);
        int centroid = find_centroid(start, 0, total);

        vector<int> comp;
        collect_nodes(centroid, 0, comp);

        if ((int)comp.size() == 1) {
            return comp[0];
        }


        vector<vector<int>> parts;
        vector<bool> visited(n + 1, false);
        visited[centroid] = true;

        for (int v : g[centroid]) {
            if (in_remaining[v] && !visited[v]) {
                vector<int> part;
                function<void(int,int)> dfs_part = [&](int u,int p) {
                    part.push_back(u);
                    visited[u] = true;
                    for (int w : g[u]) {
                        if (w != p && in_remaining[w] && !visited[w]) {
                            dfs_part(w,u);
                        }
                    }
                };
                dfs_part(v, centroid);
                parts.push_back(move(part));
            }
        }

        bool found_part = false;
        for (auto& part : parts) {
            vector<int> query_set = part;
            query_set.push_back(centroid);
            if (query(query_set)) {
                unordered_set<int> keep(query_set.begin(), query_set.end());
                for (int i = 1; i <= n; i++) {
                    if (in_remaining[i] && !keep.count(i)) {
                        in_remaining[i] = false;
                        remaining_count--;
                    }
                }
                found_part = true;
                break;
            }
        }

        if (!found_part) {
            return centroid;
        }
    }

    for (int i = 1; i <= n; i++) {
        if (in_remaining[i]) return i;
    }

    return -1; 
}

Compilation message (stderr)

/usr/bin/ld: /tmp/cctaCEn1.o: in function `findEgg(int, std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > >)':
eastereggs.cpp:(.text+0xc39): undefined reference to `query(std::vector<int, std::allocator<int> > const&)'
collect2: error: ld returned 1 exit status