Submission #1352246

#TimeUsernameProblemLanguageResultExecution timeMemory
1352246edga1Tower (BOI25_tow)C++20
48 / 100
1854 ms1408 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);
    t[0]=t[l]=t[r]=1;
    int la=0,d=3,f;
    while(d<n){
        f=0;
        for(int i=1; i<n; i++){
            if(f==la*2+2) break;
            if(t[i]) continue;
            auto atb=ask(0,lsk[la],i);
            if(atb.size()==2){
                t[i]=1;
                lsk[la*2+1]=i;
                d++;
                f++;
                continue;
            }
            if(atb[0].fi!=0){
                l=0; r=la-1;
                while(l<r){
                    int mid=(l+r)/2;
                    atb=ask(lsk[mid],lsk[la],i);
                    if(atb.size()==2) l=r=mid;
                    else if(atb[0].fi==lsk[mid] || atb[0].se==lsk[mid]) r=mid-1;
                    else l=mid+1;
                }
                t[i]=1;
                lsk[la*2-l]=i;
                d++;
                f++;
                continue;
            }
            atb=ask(0,rsk[la],i);
            if(atb.size()==2){
                t[i]=1;
                rsk[la*2+1]=i;
                d++;
                f++;
                continue;
            }
            if(atb[0].fi!=0){
                l=0; r=la-1;
                while(l<r){
                    int mid=(l+r)/2;
                    atb=ask(rsk[mid],rsk[la],i);
                    if(atb.size()==2) l=r=mid;
                    else if(atb[0].fi==rsk[mid] || atb[0].se==rsk[mid]) r=mid-1;
                    else l=mid+1;
                }
                t[i]=1;
                rsk[la*2-l]=i;
                d++;
                f++;
                continue;
            }
        }
        la=la*2+1;
    }
    cout<<"! 0";
    int p=0;
    while(lsk[p]!=-1){
        cout<<' '<<lsk[p];
        p++;
    }
    p=499;
    while(rsk[p]==-1) p--;
    while(p>=0){
        cout<<' '<<rsk[p];
        p--;
    }
    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...