Submission #1352171

#TimeUsernameProblemLanguageResultExecution timeMemory
1352171edga1Tower (BOI25_tow)C++20
0 / 100
1 ms440 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define ll long long
using namespace std;

vector<pair<int,int>> ask(int a, int b, int c){
    vector<pair<int,int>> atb;
    cout<<"? "<<a<<' '<<b<<' '<<c<<endl;
    int r; cin>>r;
    for(int i=0; i<r; i++){
        int a1,a2;
        cin>>a1>>a2;
        atb.pb({a1,a2});
    }
    return atb;
}

vector<int> s(vector<int> sk){
    if(sk.size()==1) return sk;
    int c=sk[0],n=sk.size();
    vector<int> so(n,-1),t(505,0);
    for(int i=1; i<n; i++){
        auto atb=ask(0,c,sk[i]);
        for(int j=0; j<atb.size(); j++){
            if(atb[j].fi==0) c=atb[j].se;
        }
    }
    so[0]=c;
    t[c]=1;
    int la=0;
    int d=1;
    while(d<sk.size()){
        for(int i=0; i<n; i++){
            int a=sk[i];
            if(t[a]==1) continue;
            auto atb=ask(0,so[la],a);
            if(atb.size()==2){
                so[la*2+1]=a;
                t[a]=1;
                d++;
            }
            else if(atb[0].se==a || atb[0].fi==a){
                t[a]=1;
                d++;
                int l=0,r=la-1;
                while(l<r){
                    int mid=(l+r)/2;
                    atb=ask(so[mid],so[la],a);
                    if(atb.size()==2){
                        l=r=mid;
                        break;
                    }
                    else if(atb[0].fi==so[mid]) r=mid-1;
                    else l=mid+1;
                }
                so[la*2-l]=a;
            }
        }
        la=la*2+1;
    }
    return so;
}

void solve(){
    int n; cin>>n;
    int l,r,m=-1;
    for(int i=2; i<n; i++){
        int sk=0;
        auto atb=ask(0,1,i);
        for(int j=0; j<atb.size(); j++){
            if(atb[j].fi==0) sk++;
        }
        if(sk==2){
            l=1;
            r=i;
            break;
        }
    }
    vector<int> lsk,rsk;
    lsk.pb(l);
    rsk.pb(r);
    for(int i=2; i<n; i++){
        if(i==r) continue;
        auto atb=ask(l,r,i);
        if(atb.size()>1) m=i;
        else{
            if(atb[0].fi==l || atb[0].se==l) lsk.pb(i);
            else rsk.pb(i);
        }
    }
    lsk=s(lsk);
    rsk=s(rsk);
    cout<<"! 0";
    for(int i=0; i<lsk.size(); i++) cout<<' '<<lsk[i];
    if(m!=-1) cout<<' '<<m;
    for(int i=rsk.size()-1; i>=0; i--) cout<<' '<<rsk[i];
    cout<<endl;
    return;
}

int main()
{
    int t,k;
    cin>>t>>k;
    while(t--) solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...