Submission #1089628

#TimeUsernameProblemLanguageResultExecution timeMemory
1089628TymondUnscrambling a Messy Bug (IOI16_messy)C++17
100 / 100
2 ms612 KiB
#include <bits/stdc++.h>
#include "messy.h"
using namespace std;
using ll = long long;
using ld = long double;
#define fi first
#define se second
#define vi vector<int>
#define vll vector<long long>
#define pii pair<int, int>
#define pll pair<long long, long long>
#define pb push_back
#define mp make_pair
#define eb emplace_back
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)(x).size()
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
mt19937_64 rng64(chrono::steady_clock::now().time_since_epoch().count());
inline int rand(int l,int r){return uniform_int_distribution<int>(l, r)(rng);}
inline ll rand(ll l,ll r){return uniform_int_distribution<ll>(l, r)(rng64);}
#ifdef DEBUG
auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";}
auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";}
#define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X)
#else
#define debug(...){}
#endif
 
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }
 
    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};

vi P;
int n;
string ones, zeros;

void add(int l, int p){
    if(l + 1 >= p){
        return;
    }
    
    int mid = (l + p) / 2;
    string s = ones;
    for(int i = l; i < p; i++){
        s[i] = '0';
    }
    for(int i = l; i < mid; i++){
        s[i] = '1';
        add_element(s);
        s[i] = '0';
    }

    add(l, mid);
    add(mid, p);
}

void Get(int l, int p, string x){
    int mid = (l + p) / 2;
    if(l + 1 == p){
        for(int i = 0; i < n; i++){
            if(x[i] == '0'){
                P[i] = l;
                return;
            }
        }
        return;
    }

    string pi = x;
    string d = ones;
    for(int i = 0; i < n; i++){
        if(x[i] == '0'){
            x[i] = '1';
            if(check_element(x)){
                pi[i] = '1';
                d[i] = '0';
            }

            x[i] = '0';
        }
    }
    Get(l, mid, d);
    Get(mid, p, pi);
}
 
vi restore_permutation(int N, int w, int r){
    n = N;
    P.resize(n);
    zeros = "";
    ones = "";
    for(int i = 0; i < n; i++){
        ones += "1";
        zeros += "0";
    }

    add(0, n);
    compile_set();
    Get(0, n, zeros);
 
    return P;
}
#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...