【Solution】The penguin's game
好题好题
看到 19,不禁想到询问次数可能是
假设那两个冰柱分别是
于是我一眼想二分。然而因为两个
于是想怎么把两个
而且我们可以判断一个集合内是否有奇数个
初步做法出来了,
这时候可以在集合内二分了。但是如果给两个集合都做二分,总共询问是
没有细节,上代码。
//沉着冷静
int n,x,y;
int fd(vector<int>t)
{
int sz=t.size();
vector<int>now;
now.push_back(-1);
for(auto c:t)now.push_back(c);
int sum=0;
for(int i=(1<<9);i;i>>=1)
{
if(sum+i>sz)continue;
cout<<"? "<<sum+i<<' ';
for(int j=1;j<=sum+i;j++)
cout<<now[j]<<' ';
cout<<endl;
fflush(stdout);
int p;
cin>>p;
if((((sum+i)&1)&&p==y)||(!((sum+i)&1)&&p==(x^y)));
else sum+=i;
}
return now[sum+1];
}
inline void solve(){
cin>>n>>x>>y;
int w=0,a=-1;
vector<int>st;
for(int i=0;i<=9;i++)
{
st.clear();
for(int j=1;j<=n;j++)
if((j>>i)&1)st.push_back(j);
if(!st.size())continue;
cout<<"? "<<st.size()<<' ';
for(auto c:st)cout<<c<<' ';
cout<<endl;
fflush(stdout);
int p;
cin>>p;
if(((st.size()&1)&&p==y)||(!(st.size()&1)&&p==(x^y)))
{
if(a==-1)a=fd(st);
w^=(1<<i);
}
}
int b=a^w;
if(a>b)swap(a,b);
cout<<"! "<<a<<' '<<b<<endl;
fflush(stdout);
}