제출 #1353744

#제출 시각아이디문제언어결과실행 시간메모리
1353744AvianshTower (BOI25_tow)C++20
0 / 100
12 ms1156 KiB
#include <bits/stdc++.h>

using namespace std;

map<array<int,3>,set<array<int,2>>>mem;

set<array<int,2>>query(int x, int y, int z){
    assert(x!=y&&y!=z&&z!=x);
    vector<int>arr(3);
    arr[0]=x;
    arr[1]=y;
    arr[2]=z;
    sort(arr.begin(),arr.end());
    x=arr[0];
    y=arr[1];
    z=arr[2];
    if(mem.find({x,y,z})!=mem.end()){
        return mem[{x,y,z}];
    }
    cout << "? " << x << " " << y << " " << z << endl;
    int r;
    cin >> r;
    set<array<int,2>>ans;
    for(int i = 0;i<r;i++){
        int a,b;
        cin >> a;
        cin >> b;
        ans.insert({a,b});
    }
    return mem[{x,y,z}]=ans;
}

vector<int>bin(vector<int>arr){
    int n = arr.size();
    while(n==0){
        continue;
    }
    if(n<=2){
        return arr;
    }
    vector<int>left,right;
    set<int>parted;
    int x = arr[rand()%n];
    int y = arr[rand()%n];
    while(y==x){
        y = arr[rand()%n];
    }
    parted.insert(x);
    parted.insert(y);
    left.push_back(x);
    right.push_back(y);
    while(parted.size()!=n){
        int z = arr[rand()%n];
        while(parted.find(z)!=parted.end()){
            z = arr[rand()%n];
        }
        set<array<int,2>>q = query(x,y,z);
        if(q.find({min(x,z),max(x,z)})!=q.end()){
            ///this one exists so put in left
            parted.insert(z);
            left.push_back(z);
        }
        else if(q.find({min(y,z),max(y,z)})!=q.end()){
            ///it exists in right
            parted.insert(z);
            right.push_back(z);
        }
        else{
            ///huh must restart
            parted.clear();
            left.clear();
            right.clear();
            ///lets take x,z as it bigger
            y=z;
            parted.insert(x);
            parted.insert(y);
            left.push_back(x);
            right.push_back(y);
        }
    }
    ///partition successful
    vector<int>lf = bin(left);
    vector<int>rg = bin(right);
    if(lf.size()<rg.size()){
        swap(lf,rg);
    }
    set<array<int,2>>q=query(lf.back(),lf.front(),rg.front());
    if(q.find({min(lf.front(),rg.front()),max(lf.front(),rg.front())})!=q.end()){
        reverse(lf.begin(),lf.end());
    }
    if(rg.size()!=1){
        q=query(rg.back(),rg.front(),lf.front());
        if(q.find({min(lf.back(),rg.back()),max(lf.back(),rg.back())})!=q.end()){
            reverse(rg.begin(),rg.end());
        }
    }
    vector<int>ans;
    for(int i : lf){
        ans.push_back(i);
    }
    for(int i : rg){
        ans.push_back(i);
    }
    return ans;
}

void solve(){
    mem.clear();
    int n;
    cin >> n;
    vector<int>arr(n);
    iota(arr.begin(),arr.end(),0);
    vector<int>ans = bin(arr);
    cout << "! ";
    for(int i : ans){
        cout << i << " ";
    }
    cout << endl;
}

signed main(){
    int t,k;
    cin >> t >> k;
    while(t--){
        solve();
    }
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…