CF1370F2
Solution
唐人做唐题。考虑
以
考虑到
再以
这样需要
注意到我们是找到较深点,所以它所在的可能深度范围小于等于
可以通过
#include<bits/stdc++.h>
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int MAXN=1000+10;
int n,T,dis[MAXN],dep[MAXN];
vector<int> G[MAXN];
pair<int,int> query(vector<int> vc) {
if(vc.empty()) return {0,0};
cout<<"? "<<vc.size()<<' ';for(auto id:vc) cout<<id<<' ';cout<<endl;
int x,d; cin>>x>>d;
return {x,d};
}
void dfs(int u,int f,int *dis) {
dis[u]=dis[f]+1;
for(auto v:G[u]) if(v!=f) dfs(v,u,dis);
return ;
}
vector<int> gen(int deep) {
vector<int> ans;
ffor(i,1,n) if(dep[i]==deep) ans.push_back(i);
return ans;
}
int main() {
cin>>T;
while(T--) {
cin>>n; ffor(i,1,n) G[i].clear();
ffor(i,1,n-1) {int u,v; cin>>u>>v,G[u].push_back(v),G[v].push_back(u);}
vector<int> vc; ffor(i,1,n) vc.push_back(i);
auto pr=query(vc); int len=pr.second,rt=pr.first;
dfs(rt,0,dep);
int L=(len+1)/2,R=len,ans=0;
while(L<=R) {
int mid=L+R>>1;
auto pr=query(gen(mid+1));
if(pr.second==len) ans=pr.first,L=mid+1;
else R=mid-1;
}
dfs(ans,0,dep);
int ot=query(gen(len+1)).first;
cout<<"! "<<ans<<' '<<ot<<endl;
string result; cin>>result;
}
return 0;
}