# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1220385 | mariamtsagareli | Easter Eggs (info1cup17_eastereggs) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
int q(vector<int>& v) {
cout<<"? "<<v.size();
for(int x : v) cout<<" "<<x;
cout<<"\n"<<flush;
int r;
cin>>r;
return r;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
int n; cin>>n;
vector<vector<int>> g(n+1);
for (int i=1,u,v; i<n; i++) {
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
vector<int> s(n+1,1),z(n+1),p(n+1);
vector<int> 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> c;
for (int i=1;i<=n;i++) if(s[i]) c.push_back(i);
if (c.size()==1) {
cout<<"! "<<c[0]<<"\n"<<flush;
break;
}
int u=f();
if (q(*(new vector<int>{u}))) {
cout<<"! "<<u<<"\n"<<flush;
break;
}
vector<vector<int>> a;
for (int w: g[u]) if(s[w]){
vector<int>v;
e(w,u,v);
a.push_back(v);
}
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];
s.assign(n+1,0);
for (int x:k) s[x]=1;
}
return 0;
}