# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1220388 | mariamtsagareli | Easter Eggs (info1cup17_eastereggs) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
int q(const vector<int>& v) {
cout << "? " << v.size();
for (int x : v) cout << ' ' << x;
cout << '\n' << flush;
int r; cin >> r;
return r;
}
int findEgg(int N, const vector<pair<int,int>>& B) {
vector<vector<int>> g(N+1);
for (auto& e : B) {
g[e.first].push_back(e.second);
g[e.second].push_back(e.first);
}
vector<int> s(N+1,1), z(N+1), p(N+1), t;
function<int(int,int)> d = [&](int u,int par) {
p[u]=par; z[u]=1; t.push_back(u);
for (int w: g[u]) if (w!=par && s[w]) z[u]+=d(w,u);
return z[u];
};
function<int()> f = [&]() {
t.clear(); int r=1;
while (!s[r]) r++;
d(r,0);
int m=t.size();
for (int u: t) {
int mx=m-z[u];
for (int w: g[u]) if (w!=p[u] && s[w]) mx=max(mx,z[w]);
if (mx*2<=m) return u;
}
return t[0];
};
function<void(int,int,vector<int>&)> e = [&](int u,int par,vector<int>& c) {
c.push_back(u);
for (int w: g[u]) if (w!=par && s[w]) e(w,u,c);
};
while (1) {
vector<int> cand;
for (int i=1;i<=N;i++) if (s[i]) cand.push_back(i);
if (cand.size()==1) return cand[0];
int u=f();
if (q(vector<int>{u})) return u;
vector<vector<int>> A;
for (int w: g[u]) if (s[w]) {
vector<int> tmp; e(w,u,tmp);
A.push_back(tmp);
}
int l=0,r=A.size();
while (r-l>1) {
int m=(l+r)/2;
vector<int> v={u};
for (int i=l;i<m;i++) for (int x:A[i]) v.push_back(x);
if (q(v)) r=m;
else l=m;
}
vector<int> K=A[l];
fill(s.begin(),s.end(),0);
for (int x:K) s[x]=1;
}
}