Submission #1352273

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

map<pair<int,pair<int,int>>,vector<pair<int,int>>> mp;

vector<pair<int,int>> ask(int a, int b, int c){
    if(a>b) swap(a,b);
    if(a>c) swap(a,c);
    if(b>c) swap(b,c);
    if(mp.find({a,{b,c}})!=mp.end()) return mp[{a,{b,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});
    }
    mp[{a,{b,c}}]=atb;
    return atb;
}

void solve(){
    int n; cin>>n;
    mp.clear();
    int l=1,r=-1;
    for(int i=2; i<n; i++){
        int sk=0,p=-1;
        auto atb=ask(0,l,i);
        for(int j=0; j<atb.size(); j++){
            if(atb[j].fi==0) sk++,p=j;
        }
        if(sk==2) r=i;
        else if(sk==1) l=atb[p].se;
    }
    vector<int> lsk(500,-1),rsk(500,-1);
    lsk[0]=l;
    rsk[0]=r;
    vector<int> t(n,0),sk(1100,-1);
    t[0]=t[l]=t[r]=1;
    sk[550]=l;
    sk[551]=0;
    sk[552]=r;
    int lf=550,rf=552,d=3;
    while(d<n){
        for(int i=1; i<n; i++){
            if(t[i]) continue;
            while(sk[lf]!=-1) lf--;
            lf++;
            while(sk[rf]!=-1) rf++;
            rf--;
            auto atb=ask(sk[lf],sk[rf],i);
            if(atb.size()==3){
                int di=rf-lf;
                sk[rf+di]=i;
                sk[rf+di-n]=i;
                t[i]=1;
                d++;
            }
            if(atb.size()==2){
                if((atb[0].fi==i || atb[0].se==i) && (atb[1].fi==i || atb[1].se==i)){
                    int di=(n-rf+lf)/2;
                    sk[rf+di]=i;
                    sk[rf+di-n]=i;
                    t[i]=1;
                    d++;
                }else{
                    int di=rf-lf;
                    pair<int,int> pa;
                    if(atb[0].fi==i || atb[0].se==i) pa=atb[0];
                    else pa=atb[1];
                    if(pa.fi==sk[rf] || pa.se==sk[rf]){
                        sk[rf+di]=i;
                        sk[rf+di-n]=i;
                    }else{
                        sk[lf-di]=i;
                        sk[lf-di+n]=i;
                    }
                    t[i]=1;
                    d++;
                }
            }
            if(atb.size()==1){
                if(atb[0].fi!=i && atb[0].se!=i) continue;
                if(atb[0].fi==sk[rf] || atb[0].se==sk[rf]){
                    l=lf+1,r=rf-1;
                    while(l<r){
                        int mid=(l+r)/2;
                        atb=ask(sk[mid],sk[rf],i);
                        if(atb.size()==2) l=r=mid;
                        else if(atb[0].fi==i || atb[0].se==i) l=mid+1;
                        else r=mid-1;
                    }
                    int di=rf-l;
                    sk[rf+di]=i;
                    sk[rf+di-n]=i;
                }
                else{
                    l=lf+1,r=rf-1;
                    while(l<r){
                        int mid=(l+r)/2;
                        atb=ask(sk[mid],sk[lf],i);
                        if(atb.size()==2) l=r=mid;
                        else if(atb[0].fi==i || atb[0].se==i) r=mid-1;
                        else l=mid+1;
                    }
                    int di=l-lf;
                    sk[lf-di]=i;
                    sk[lf-di+n]=i;
                }
                t[i]=1;
                d++;
            }
        }
    }
    cout<<"!";
    for(int i=lf; i<lf+n; i++) cout<<' '<<sk[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...