题解:CF1521C Nastia and a Hidden Permutation
首先我们的询问有 4 个参数,但是其中
注意到
现在考虑如何找
我们剩余的次数还有
遇到最小值为
遇到最小值为
正反交的次数最多为
如果想要跑满询问,
代码非常简单,没有坑点难点。
:::success[code]
int n,p[N];
int ask(int type,int x,int y){
int ex = 0;
if(type==1) ex = n-1;
else ex = 1;
write("? ",type,' ',x,' ',y,' ',ex);
cout<<endl;
int res;
read(res);
return res;
}
void work(){
read(n);
int i1 = 0;
for(int i=1;i<=n/2;++i){
int res = ask(2,i*2-1,i*2);
if(res==1){
i1 = i*2-1;
p[i*2-1] = 1;
break;
}
if(res==2){
if(ask(2,i*2,i*2-1)==1){
i1 = i*2;
p[i*2] = 1;
break;
}
}
}
if(!i1) i1 = n,p[n] = 1;
for(int i=1;i<=n;++i){
if(i1==i) continue;
p[i] = ask(1,i1,i);
}
write("! ");
for(int i=1;i<=n;++i){
write(p[i],' ');
}cout<<endl;
return ;
}
int T;
signed main(){
read(T);
while(T--) work();
return 0;
}
:::