RT.
官方正解思路,后两个 Subtask 全 RE。
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+10;
int n,m1,m2,m3;
int a[N],t[N];
int x,y;
int last,now;
inline void work(int x){
int s=0;
for(int i=1;i<=n;i++)
if(!a[i])
s++;
printf("? %d ",s);
for(int i=1;i<=n;i++)
if(!a[i])
printf("%d ",i);
printf("%d\n",x);
fflush(stdout);
}
int main(){
scanf("%d%d%d%d",&n,&m1,&m2,&m3);
int p=log2(n);
if((1<<p)==n){
work(n);
scanf("%d%d",&x,&y);
a[y]=n;
last=y;
}
else{
work(1<<p);
scanf("%d",&x);
long long s=0;
while(x--){
scanf("%d",&y);
s+=y;
}
work((1<<p)+1);
scanf("%d",&x);
while(x--){
scanf("%d",&y);
t[++t[0]]=y;
s-=y;
}
a[s]=1<<p;
last=s;
for(int i=1;i<=t[0];i++){
printf("! %d %d\n",t[i],s);
fflush(stdout);
scanf("%d",&x);
a[t[i]]=a[s]+x;
}
}
p--;
while(p>1){
t[0]=0;
work(1<<p);
int x; scanf("%d",&x);
while(x--){
scanf("%d",&y);
t[++t[0]]=y;
}
for(int i=1;i<=t[0];i++){
printf("! %d %d\n",last,t[i]);
fflush(stdout);
scanf("%d",&x);
if(!x) a[t[i]]=1<<p,now=t[i];
else a[t[i]]=a[last]-x;
}
last=now;
p--;
}
int first=0,second;
for(int i=1;i<=n;i++)
if(!a[i]){
printf("! %d %d\n",last,i);
fflush(stdout);
scanf("%d",&x);
if(x==1) a[i]=3,now=i;
else (!first?first:second)=i;
}
printf("! %d %d\n",now,first);
fflush(stdout);
scanf("%d",&x);
a[(!x?first:second)]=1;
a[(!x?second:first)]=2;
printf("A ");
for(int i=1;i<=n;i++)
printf("%d ",a[i]);
puts("");
fflush(stdout);
return 0;
}