Submission #1318858

#TimeUsernameProblemLanguageResultExecution timeMemory
1318858g31niusEaster Eggs (info1cup17_eastereggs)C++20
0 / 100
2 ms484 KiB
#include <vector> using namespace std; int query(vector<int> islands); vector<vector<int>> adj; vector<int> subtree; vector<int> subtree_size; vector<bool> removed; void calc_size(int node, int parent) { subtree_size[node] = 1; for (int next : adj[node]) { if (next != parent && !removed[next]) { calc_size(next, node); subtree_size[node] += subtree_size[next]; } } } int find_centroid(int node, int parent, int tree_size) { for (int next : adj[node]) { if (next != parent && !removed[next] && subtree_size[next] > tree_size / 2) { return find_centroid(next, node, tree_size); } } return node; } void get_subtree(int node, int parent) { subtree.push_back(node); for (int next : adj[node]) { if (next != parent && !removed[next]) { get_subtree(next, node); } } } int solve(int node) { calc_size(node, -1); int centroid = find_centroid(node, -1, subtree_size[node]); // Check each subtree of the centroid for (int child : adj[centroid]) { if (removed[child]) continue; subtree.clear(); get_subtree(child, centroid); if (query(subtree) == 1) { // Egg is in this subtree return solve(child); } } // Egg is at centroid return centroid; } int findEgg(int N, vector<pair<int, int>> bridges) { // Build adjacency list adj.assign(N + 1, vector<int>()); subtree_size.assign(N + 1, 0); removed.assign(N + 1, false); for (auto& edge : bridges) { adj[edge.first].push_back(edge.second); adj[edge.second].push_back(edge.first); } return solve(1); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...