#include <bits/stdc++.h>
#include "grader.h"
// #include "grader.cpp"
using namespace std;
#define all(x) x.begin(), x.end()
#define pb push_back
#define nl '\n'
int findEgg(int n, vector <pair<int, int>> edges) {
vector<set<int>> adj(n);
for(auto &[u, v] : edges) {
u--, v--;
adj[u].emplace(v);
adj[v].emplace(u);
}
vector<int> isl;
auto dfs = [&](auto &&dfs, int v, int p) -> void {
isl.pb(v + 1);
for(auto to : adj[v]) {
if(to == p) continue;
dfs(dfs, to, v);
}
};
auto dfs1 = [&](auto &&dfs, int v, int p, vector<vector<int>> &chd) -> void {
for(auto to : adj[v]) {
if(to == p) continue;
dfs(dfs, to, v, chd);
for(auto i : chd[to]) chd[v].pb(i);
}
};
vector<int> vis(n);
while(true) {
bool flag = false;
for(auto [u, v] : edges) {
if(vis[u] || vis[v]) continue;
adj[u].erase(v);
adj[v].erase(u);
dfs(dfs, u, -1);
auto isl1 = isl;
isl.clear();
dfs(dfs, v, -1);
auto isl2 = isl;
isl.clear();
int x = isl1.size(), y = isl2.size();
int cur = x + y;
if((x == cur / 2 && y == (cur + 1) / 2) || (x == (cur + 1) / 2 && y == cur / 2)) {
// cout << "u v " << u + 1 << ' ' << v + 1 << ": ";
if(query(isl1)) {
if(x == 1) {
return isl1[0];
}
for(auto to : isl2) {
to--;
vis[to] = 1;
// cout << to + 1 << ' ';
}
} else {
if(y == 1) {
return isl2[0];
}
for(auto to : isl1) {
to--;
vis[to] = 1;
// cout << to + 1 << ' ';
}
}
// cout << nl;
flag = true;
break;
}
adj[u].emplace(v);
adj[v].emplace(u);
}
if(!flag) {
for(int r = 0; r < n; r++) {
if(vis[r]) continue;
vector <vector<int>> chd(n);
for(int i = 0; i < n; i++) chd[i].pb(i);
dfs1(dfs1, r, -1, chd);
vector<int> tr;
for(auto to : adj[r]) {
tr.pb(to);
}
int m = tr.size();
for(int mask = 0; mask < (1 << m); mask++) {
vector<int> isl1, isl2;
isl1.pb(r + 1);
isl2.pb(r + 1);
for(int i = 0; i < m; i++) {
int v = tr[i];
if(mask >> i & 1) {
for(auto to : chd[v]) isl1.pb(to + 1);
} else {
for(auto to : chd[v]) isl2.pb(to + 1);
}
}
int x = isl1.size(), y = isl2.size();
int cur = x + y;
if((x == cur / 2 && y == (cur + 1) / 2) || (x == (cur + 1) / 2 && y == cur / 2)) {
// for(auto i : isl1) cout << i << ' ';
// cout << nl;
// for(auto i : isl2) cout << i << ' ';
// cout << nl;
// cout << "r " << r + 1 << ": ";
if(query(isl1)) {
for(auto to : isl2) {
to--;
// cout << to + 1 << ' ';
if(to == r) continue;
vis[to] = 1;
adj[r].erase(to);
}
} else {
for(auto to : isl1) {
to--;
// cout << to + 1 << ' ';
if(to == r) continue;
vis[to] = 1;
adj[r].erase(to);
}
}
// cout << nl;
flag = true;
break;
}
}
if(flag) break;
}
}
if(!flag) break;
}
return 1;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |