제출 #1342668

#제출 시각아이디문제언어결과실행 시간메모리
1342668m5588ohammedUnscrambling a Messy Bug (IOI16_messy)C++20
70 / 100
2 ms580 KiB
#include <bits/stdc++.h>
using namespace std;
#include "messy.h"
int n,w,r;
int ans[1000],ot[1000];
void ins_string(vector <int> pos){
    string a="";
    for(int i=0;i<n;i++) a+='0';
    for(int i:pos) a[i]='1';
    add_element(a);
    return;
}
void solve_ins(vector <int> S_L,vector <int> S_R){
    //cout<<S_L.size()<<" "<<S_R.size()<<endl;
    if(S_L.size()<=1&&S_R.size()<=1) return;
    //stage 1
    for(int i=0;i<S_R.size();i++){
        ins_string({S_L[0],S_R[i]});
    }
    for(int i=1;i<S_L.size();i++){
        ins_string({S_R[0],S_L[0],S_L[i]});
    }
    for(int i=1;i<((int)S_L.size()+2)/2;i++){
        ins_string({S_L[0],S_L[i]});
    }
    for(int i=1;i<((int)S_R.size()+2)/2;i++){
        ins_string({S_R[0],S_R[i]});
    }
    //stage 2
    vector <int> S_L_L,S_L_R,S_R_L,S_R_R;
    for(int i=1;i<((int)S_L.size()+2)/2;i++){
        S_L_L.push_back(S_L[i]);
    }
    for(int i=((int)S_L.size()+2)/2;i<(int)S_L.size();i++){
        S_L_R.push_back(S_L[i]);
    }
    for(int i=1;i<((int)S_R.size()+2)/2;i++){
        S_R_L.push_back(S_R[i]);
    }
    for(int i=((int)S_R.size()+2)/2;i<(int)S_R.size();i++){
        S_R_R.push_back(S_R[i]);
    }
    solve_ins(S_L_L,S_L_R);
    solve_ins(S_R_L,S_R_R);
    return;
}
void ins(){
    vector <int> S_L,S_R;
    for(int i=0;i<(n+1)/2;i++){
        ins_string({i});
        S_L.push_back(i);
    }
    for(int i=(n+1)/2;i<n;i++){
        S_R.push_back(i);
    }
    solve_ins(S_L,S_R);
    return;
}
bool ask_string(vector <int> pos){
    string a="";
    for(int i=0;i<n;i++) a+='0';
    for(int i:pos) a[i]='1';
    return check_element(a);
}
int rn=0;
void solve_ask(vector <int> S_L,vector <int> S_R,vector <int> P_L,vector <int> P_R){
    //cout<<S_L.size()<<" "<<P_L.size()<<" "<<S_R.size()<<" "<<P_R.size()<<endl;
    //if(S_L.size()>0) cout<<S_L[0]<<endl;
    if(S_L.size()<=1&&S_R.size()<=1){
        if(S_L.size()==1) ans[S_L[0]]=P_L[0];
        if(S_R.size()==1) ans[S_R[0]]=P_R[0];
        return;
    }
    //for(int i:P_L) cout<<i<<" ! ";
    //cout<<endl;
    //for(int i:P_R) cout<<i<<" * ";
    //cout<<endl;
    vector <int> S_L_L,S_L_R,S_R_L,S_R_R;
    vector <int> P_L_L,P_L_R,P_R_L,P_R_R;
    ans[S_L[0]]=-1;ans[S_R[0]]=-1;
    for(int i=0;i<S_L.size()-1;i++){
        if(ask_string({P_L[i],P_R[0]})==1){
            ans[S_L[0]]=P_L[i];    
        }
    }
    if(ans[S_L[0]]==-1) ans[S_L[0]]=P_L.back();    
    for(int i=0;i<S_R.size()-1;i++){
        if(ask_string({P_R[i],(ans[S_L[0]] == P_L[0] ? P_L[1] : P_L[0]), ans[S_L[0]]})==1){
            ans[S_R[0]]=P_R[i];    
        }
    }
    if(ans[S_R[0]]==-1) ans[S_R[0]]=P_R.back();

    for(int i=0;i<S_L.size()-1;i++){
        if(ans[S_L[0]]==P_L[i]) continue;
        //cout<<i<<" "<<P_L[i]<<" "<<ans[S_L[0]]<<endl;
        if(ask_string({ans[S_L[0]],P_L[i]})==1){
            P_L_L.push_back(P_L[i]);
        }
        else{
            //cout<<"YESS"<<endl;
            P_L_R.push_back(P_L[i]);
        }
    }
    if(ans[S_L[0]]!=P_L.back()){
        if(P_L_L.size()<=P_L_R.size()) P_L_L.push_back(P_L.back());
        else P_L_R.push_back(P_L.back());
    }
    //exit(0);
    for(int i=0;i<S_R.size()-1;i++){
        if(ans[S_R[0]]==P_R[i]) continue;
        if(ask_string({ans[S_R[0]],P_R[i]})==1){
            P_R_L.push_back(P_R[i]);
        }
        else P_R_R.push_back(P_R[i]);
    }
    if(ans[S_R[0]]!=P_R.back()){
        if(P_R_L.size()<=P_R_R.size()) P_R_L.push_back(P_R.back());
        else P_R_R.push_back(P_R.back());
    }
    //cout<<S_L[0]<<" "<<ans[S_L[0]]<<" "<<S_R[0]<<" "<<ans[S_R[0]]<<endl;
    //Stage 2
    for(int i=1;i<((int)S_L.size()+2)/2;i++){
        S_L_L.push_back(S_L[i]);
    }
    for(int i=((int)S_L.size()+2)/2;i<(int)S_L.size();i++){
        //cout<<"! "<<S_L[i]<<endl;
        S_L_R.push_back(S_L[i]);
    }
    for(int i=1;i<((int)S_R.size()+2)/2;i++){
        S_R_L.push_back(S_R[i]);
    }
    for(int i=((int)S_R.size()+2)/2;i<(int)S_R.size();i++){
        //cout<<"! "<<S_R[i]<<endl;
        S_R_R.push_back(S_R[i]);
    }

    solve_ask(S_L_L,S_L_R,P_L_L,P_L_R);
    solve_ask(S_R_L,S_R_R,P_R_L,P_R_R);
    return;
}
void ask(){
    vector <int> P_L,P_R,S_L,S_R;
    for(int i=0;i<(n+1)/2;i++){
        S_L.push_back(i);
    }
    for(int i=(n+1)/2;i<n;i++){
        S_R.push_back(i);
    }
    for(int i=0;i<n-1;i++){
        if(ask_string({i})==1) P_L.push_back(i);
        else P_R.push_back(i);
    }
    if(P_L.size()>P_R.size()) P_R.push_back(n-1);
    else P_L.push_back(n-1);
    solve_ask(S_L,S_R,P_L,P_R);
    return;
}
std::vector<int> restore_permutation(int N, int W, int R) {
    n=N;w=W;r=R;
    ins();
    compile_set();
    ask();
    vector <int> idx;
    for(int i=0;i<n;i++){
        //cout<<ans[i]<<" "<<endl;
        ot[ans[i]]=i;
    }
    for(int i=0;i<n;i++){
        idx.push_back(ot[i]);
    }
    return idx;
}
#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...