Submission #1342519

#TimeUsernameProblemLanguageResultExecution timeMemory
1342519m5588ohammedUnscrambling a Messy Bug (IOI16_messy)C++20
0 / 100
2 ms836 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){
    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()+1)/2;i++){
        ins_string({S_L[0],S_L[i]});
    }
    for(int i=1;i<((int)S_R.size()+1)/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()+1)/2;i++){
        S_L_L.push_back(S_L[i]);
    }
    for(int i=((int)S_L.size()+1)/2;i<(int)S_L.size();i++){
        S_L_R.push_back(S_L[i]);
    }
    for(int i=1;i<((int)S_R.size()+1)/2;i++){
        S_R_L.push_back(S_R[i]);
    }
    for(int i=((int)S_L.size()+1)/2;i<(int)S_L.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){
    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;
    }
    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;
    for(int i=0;i<S_L.size();i++){
        if(ask_string({P_L[i],P_R[0]})==1){
            ans[S_L[0]]=P_L[i];    
        }
    }
    for(int i=0;i<S_R.size();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];    
        }
    }
    for(int i=0;i<S_L.size();i++){
        if(ans[S_L[0]]!=P_L[i]&&ask_string({ans[S_L[0]],P_L[i]})==1){
            P_L_L.push_back(P_L[i]);
        }
        else P_L_R.push_back(P_L[i]);
    }
    for(int i=0;i<S_R.size();i++){
        if(ans[S_R[0]]!=P_R[i]&&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]);
    }
    //Stage 2
    for(int i=1;i<((int)S_L.size()+1)/2;i++){
        S_L_L.push_back(S_L[i]);
    }
    for(int i=((int)S_L.size()+1)/2;i<(int)S_L.size();i++){
        S_L_R.push_back(S_L[i]);
    }
    for(int i=1;i<((int)S_R.size()+1)/2;i++){
        S_R_L.push_back(S_R[i]);
    }
    for(int i=((int)S_L.size()+1)/2;i<(int)S_R.size();i++){
        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/2;i++){
        S_L.push_back(i);
    }
    for(int i=n/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++){
        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...