题目链接
题目思路
交互题十有八九是二分
这个是对边进行dfs序,然后二分边求出那条最大的边
代码
#include<bits/stdc++.h>
#define pii pair<int,int>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=1e5+5,inf=(1ll<<31)-1,mod=1e9+7;
const double eps=1e-6;
int n;
vector<int> g[maxn];
pair<int,int> pa[maxn];
int cnt;
int query(int l,int r){
set<int> se;
for(int i=l;i<=r;i++){
se.insert(pa[i].fi);
se.insert(pa[i].se);
}
cout<<"? "<<se.size()<<" ";
for(auto x:se){
cout<<x<<" ";
}
cout<<endl;
int x; cin>>x;
return x;
}
void dfs(int u,int fa){
for(auto x:g[u]){
if(x==fa) continue;
pa[++cnt]={u,x};
dfs(x,u);
}
}
signed main(){
cin>>n;
for(int i=1,u,v;i<=n-1;i++){
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1,1);
int ma=query(1,n-1);
int l=1,r=n-1,ans=1;
while(l<=r){
int mid=(l+r)/2;
int tmp=query(l,mid);
if(tmp==ma){
ans=mid;
r=mid-1;
}else{
l=mid+1;
}
}
cout<<"! "<<pa[ans].fi<<" "<<pa[ans].se<<endl;
return 0;
}