Submission #1201791

#TimeUsernameProblemLanguageResultExecution timeMemory
1201791adiyerPermutation (APIO22_perm)C++20
100 / 100
2 ms328 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

void solve(ll k, int b, bool f, vector < int > &a){
    if(b <= 0) return;
    b -= 2;
    if(b == -1){
        a.push_back(a.size());
        if(k & 1){
            for(int &x : a) x++;
            a.push_back(0);
        }
        return;
    }
    int t = (k >> b) & 3;
    if(a.empty()){
        if(t == 2) a = {0};
        else a = {1, 0}, f = 1;
    }
    else{
        if(t == 0){
            a.push_back(a.size());
            a.push_back(a.size());
        }
        else if(t == 1){
            a.push_back(a.size());
            a.push_back(a.size());
            for(int &x : a) x++;
            a.push_back(0), f = 1;
        }
        else if(t == 2){
            a.push_back(a.size());
            for(int &x : a) x++;
            a.push_back(0);
            a.push_back(a.size()), f = 1;
        }
        else if(f){
            a.push_back(a.size());
            a.push_back(a.size());
            for(int &x : a)
                if(x > 1)
                    x++;
            a.push_back(2);
        }
        else{
            a.push_back(a.size());
            for(int &x : a) x++;
            a.push_back(0);
            a.push_back(a.size());
            for(int &x : a) x++;
            a.push_back(0);
            f = 1;
        }
    }
    solve(k, b, f, a);
}

vector < int > a;

vector < int > construct_permutation(ll k){
    a.clear(), solve(k, 64 - __builtin_clzll(k), 0, a);
    return a;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...