제출 #420719

#제출 시각아이디문제언어결과실행 시간메모리
420719pliamUnscrambling a Messy Bug (IOI16_messy)C++14
70 / 100
2 ms460 KiB
#include "messy.h"
#include <bits/stdc++.h>
using namespace std;
#define MAXLOGN 7
#define MAXN 128

string extra_s[9],extra_f[9];
int logn,N,p[MAXN+1];

void p2write(int start,int end,int extra){
    if(start==end) return;
    //write the first half with 1
    int mid=(start+end)/2;
    string tmp=extra_s[extra];
    for(int i=start;i<=mid;i++){
        tmp[i-1]='0';
        add_element(tmp);
        tmp[i-1]='1';
    }
    p2write(start,mid,extra+1);
    p2write(mid+1,end,extra+1);
}

void bsearch(int k){//k>=logn(k is the position of the search element in p)
    int ext=1;
    int lo=logn+2,hi=N;
    while(lo<hi){
        int mid=(lo+hi)/2;
        string tmp=extra_f[ext];
        tmp[k]='0';
        if(check_element(tmp)){
            hi=mid;
        }else{
            lo=mid+1;
        }
        ext++;
    }
    p[k]=lo-1;
}

vector<int> restore_permutation(int n, int w, int r) {
    logn=log2(n);
    N=n;
    if(n==8){
        //first phase write
        string s;
        for(int i=0;i<n;i++){
            s+='0';
        }
        for(int i=1;i<=n;i++){
            s[i-1]='1';
            add_element(s);
        }
        //compile set
        compile_set();
        //first phase read
        string f;
        for(int i=0;i<n;i++){
            f+='0';
        }
        for(int i=1;i<=n;i++){
            for(int j=0;j<n;j++){
                if(f[j]=='1') continue;
                f[j]='1';
                if(check_element(f)){
                    p[j]=i-1;
                    break;
                }
                f[j]='0';
            }
        }
        //answer
        return vector<int>(p,p+n);
    }else{
    //first phase write
    for(int i=0;i<n;i++){
        extra_s[0]+='0';
    }
    for(int i=1;i<=logn+1;i++){
        extra_s[i]=extra_s[i-1];
        extra_s[i][i-1]='1';
        add_element(extra_s[i]);
    }
    for(int i=1;i<=logn+1;i++){//complement
        for(int j=0;j<n;j++){
            extra_s[i][j]=(extra_s[i][j]=='1')?'0':'1';
        }
    }
    //second phase write
    p2write(logn+2,n,1);

    //compile set
    compile_set();

    //first phase read
    for(int i=0;i<n;i++){
        extra_f[0]+='0';
    }
    for(int i=1;i<=logn+1;i++){
        extra_f[i]=extra_f[i-1];
        for(int j=0;j<n;j++){
            if(extra_f[i][j]=='1') continue;
            extra_f[i][j]='1';
            if(check_element(extra_f[i])){
                p[j]=i-1;
                break;
            }
            extra_f[i][j]='0';
        }
    }
    for(int i=1;i<=logn+1;i++){//complement
        for(int j=0;j<n;j++){
            extra_f[i][j]=(extra_f[i][j]=='1')?'0':'1';
        }
    }

    //second phase read
    for(int i=0;i<n;i++){
        if(extra_f[logn+1][i]=='0') continue;
        bsearch(i);
    }

    //answer
    return vector<int>(p,p+n);
    }
}
#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...