题解:AT_kupc2020_j Median Query
shinzAnmono · · 题解
考虑
如果
设当前
最后我们把相同的数判一下大小即可,询问次数上界不超过
#include<iostream>
#include<algorithm>
#include<vector>
const int sz=6e4+10;
bool query1(int i,int j){
std::cout<<"? 2 "<<i<<" "<<j<<std::endl;
int res;
std::cin>>res;
return res==i;
}
int query2(int i,int j,int k){
std::cout<<"? 1 "<<i<<" "<<j<<" "<<k<<std::endl;
int res;
std::cin>>res;
return res;
}
int p[sz];
void solve(int N){
int A=query2(1,2,3),B=query2(1,2,4),C=query2(1,3,4),D=query2(2,3,4),L,R,a,b,c,d;
if(A==B)p[a=1]=p[b=2]=L=A,p[c=3]=p[d=4]=R=C;
if(A==C)p[a=1]=p[b=3]=L=A,p[c=2]=p[d=4]=R=B;
if(A==D)p[a=2]=p[b=3]=L=A,p[c=1]=p[d=4]=R=C;
if(L>R)std::swap(L,R),std::swap(a,c),std::swap(b,d);
for(int i=5;i<=N;i++){
int k=query2(a,c,i);
if(k>L&&k<R)p[i]=k;
if(k<=L){
int q=query2(b,d,i);
if(k<q)p[b]=L,b=i,p[a]=p[i]=L=k;
else p[a]=L,a=i,p[b]=p[i]=L=q;
}
if(k>=R){
int q=query2(b,d,i);
if(k>q)p[d]=R,d=i,p[c]=p[i]=R=k;
else p[c]=R,c=i,p[d]=p[i]=R=q;
}
}
(query1(a,b)?p[a]:p[b])=1,(query1(c,d)?p[d]:p[c])=N;
std::cout<<"! ";
for(int i=1;i<=N;i++)std::cout<<p[i]<<" ";
std::cout<<std::endl;
}
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n;
std::cin>>n,solve(n);
return 0;
}