제출 #341919

#제출 시각아이디문제언어결과실행 시간메모리
341919bigDuckUnscrambling a Messy Bug (IOI16_messy)C++14
0 / 100
3 ms492 KiB

#include "messy.h"


#include<bits/stdc++.h>
using namespace std;
#define INIT  ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define ll long long
#define pii pair<int, int>
#define count_bits __builtin_popcount

int n;

/*
    add_element("0");
    compile_set();
    check_element("0");
*/




string s;
void build(int l, int r){
int mid=(l+r)>>1ll;


for(int i=l; i<=mid; i++){
    s[i-1]='1';
    add_element(s);
    s[i-1]='0';
}

if(l==r){
    return ;
}

//construiect partea dreapta, partea stanga fiind complet acoperita
for(int i=l; i<=mid; i++){
    s[i-1]='1';
}
build(mid+1, r);

//construiesc partea stanga, partea dreapta fiind total acoperita
for(int i=l; i<=mid; i++){
    s[i-1]='0';
}
build(l, mid);



}



vector<int> seg[1001];


void build_seg(int v, int tl, int tr){

    if(tl==(tr-1) ){
        for(int i=0; i<n; i++){
            if(s[i]=='0'){
                s[i]='1';
                bool res=check_element(s);
                if(res){
                    seg[2*v].pb(i+1);
                }
                s[i]='0';
            }
        }
        return ;
    }


    int mid=(tl+tr)>>1ll;
    for(int i=0; i<n; i++){
        if(s[i]=='0'){
            s[i]='1';
            bool res=check_element(s);
            if(res){
                seg[2*v].pb(i+1);
            }
            s[i]='0';
        }
    }
    for(auto i:seg[2*v]){
        s[i-1]='1';
    }
    for(int i=0; i<n; i++){
        if(s[i]=='0'){
            seg[2*v+1].pb(i+1);
        }
    }

    build_seg(v*2+1, mid+1, tr);
    for(auto i:seg[2*v]){
        s[i-1]='0';
    }
    build_seg(2*v, tl, mid);
}







void nulify(){
    for(int i=0; i<n; i++){
        s[i]='0';
    }
}


vector<int> res;

void get_all(int v, int l, int r){
    if(l==r){
        res[l-1]=seg[v][0];
        return;
    }
    get_all(v*2, l, (l+r)>>1ll);
    get_all(2*v+1, ((l+r)>>1ll)+1, r);
    return;
}


std::vector<int> restore_permutation(int N, int w, int r) {
    n=N;
    for(int i=0; i<n; i++){
        s.pb('0');
    }
    build(1, n);
    compile_set();
    nulify();
    build_seg(1, 1, n);
    res.resize(n);
    get_all(1, 1, n);
    return res;
}
#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...