#include<bits/stdc++.h>
using namespace std;
int n,m,q,shu[51][20],you[51][20],sizeyou[51],di[51][20],sizedi[51],qing,wei,ww;
int main(){
cin>>n>>m>>q;
for(int i=1;i<=49;i++){
you[i][1]=(i-1)*19+1;
sizeyou[i]=1;
for(int j=1;j<=18;j++){
cout<<"? "<<(i-1)*19+1<<' '<<(i-1)*19+j+1<<'\n';
cin>>qing;
if(!qing){
sizeyou[i]++;
you[i][sizeyou[i]]=(i-1)*19+j+1;
}
else{
sizedi[i]++;
di[i][sizedi[i]]=(i-1)*19+j+1;
}
}
if(sizeyou[i]>sizedi[i]){
swap(sizeyou[i],sizedi[i]);
swap(you[i],di[i]);
}
}
sizeyou[50]=1;
you[50][1]=932;
for(int i=933;i<=n;i++){
cout<<"? "<<932<<' '<<i<<'\n';
cin>>qing;
if(!qing){
sizeyou[50]++;
you[50][sizeyou[50]]=i;
}
else{
sizedi[50]++;
di[50][sizedi[50]]=i;
}
}
if(sizeyou[50]>sizedi[50]){
swap(sizeyou[50],sizedi[50]);
swap(you[50],di[50]);
}
for(int i=1;i<=49;i++){
if(sizeyou[i]==9){
wei=i;
}
}
for(int i=1;i<=50;i++){
if(sizeyou[i]==1){
ww=i;
}
}
if(wei&&!ww){
cout<<"! ";
for(int i=1;i<=10;i++){
cout<<di[wei][i]<<' ';
}
exit(0);
}
cout<<"! ";
for(int i=1;i<=50;i++){
for(int j=1;j<=sizeyou[i];j++){
cout<<you[i][j]<<' ';
}
}
return 0;
}
想的是,注意到 Q=950,那么考虑将整堆硬币分为 19 组。因为当有 20 组的时候经过测试会有数据将所有假币放到一起来卡掉我的代码。
现在是 WA #1。绷。