# | Submission time | Handle | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1099661 | 2024-10-12T01:26:22 Z | tuannm | Easter Eggs (info1cup17_eastereggs) | C++17 | 0 ms | 0 KB |
#include<bits/stdc++.h> #include "grader.h" #define ii pair<int, int> #define fi first #define se second #define pb push_back using namespace std; const int maxN = 520; bool removed[maxN]; int sz[maxN], in[maxN], out[maxN], cnt; vector<int> adj[maxN]; void DFS(int u = 1, int p = 0){ in[u] = ++cnt; sz[u] = 1; for(int v : adj[u]){ if(removed[v] || v == p) continue; DFS(v, u); sz[u] += sz[v]; } out[u] = cnt; } int findEgg(int N, vector<ii> bridges){ for(auto [u, v] : bridges) adj[u].pb(v), adj[v].pb(u); for(int Q = 1; Q <= 9; ++Q){ cnt = 0; int root = 0; for(int i = 1; i <= n; ++i){ if(removed[i]) continue; root = i; break; } DFS(root); int zz = sz[root] / 2; int s = root; for(int i = 1; i <= n; ++i){ if(removed[i]) continue; if(abs(zz - sz[i]) < abs(zz - sz[s])) s = i; } vector<int> vec; for(int i = 1; i <= n; ++i){ if(removed[i]) continue; if(in[s] <= in[i] && in[i] <= out[s]) vec.pb(i); } if(query(vec)){ for(int i = 1; i <= n; ++i){ if(removed[i]) continue; if(in[s] <= in[i] && in[i] <= out[s]) continue; removed[i] = true; } } else{ for(int i : vec) removed[i] = true; } int cntRem = 0; for(int i = 1; i <= n; ++i) cntRem += !removed[i]; if(cntRem == 1){ for(int i = 1; i <= n; ++i) if(!removed[i]) return i; } } return -1; }