Submission #1201692

#TimeUsernameProblemLanguageResultExecution timeMemory
1201692adiyerPermutation (APIO22_perm)C++20
91.33 / 100
7 ms512 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

void add(vector < int > &v, int pos, int x){
    vector < int > nw;
    for(ll i = 0; i < pos; i++) nw.push_back(v[i]);
    nw.push_back(x);
    for(ll i = pos; i < v.size(); i++) nw.push_back(v[i]);
    v = nw;
}

vector < ll > calc(vector < int > &v) {
    vector < ll > dp(v.size() + 1, 0);
    dp[0] = 1;
    for(int x : v)
        for(int i = 0; i <= x; i++)
            dp[x + 1] += dp[i];
    return dp;
}

vector < int > construct_permutation(ll k){
    int x = 0;
    vector < int > ans;
    for(ll bit = 59; bit >= 1; bit--){
        if(k >= (1ll << bit)){
            for(int i = 0; i < bit; i++) ans.push_back(x++);
            break;
        }
    }
    while(1){
        ll sum = 0, pos = 1;
        vector < ll > dp = calc(ans);
        for(ll val : dp) sum += val;
        if(sum == k) break;
        for(ll i = 0; i < dp.size(); i++)
            if(sum + dp[i] <= k && dp[i] > dp[pos])
                pos = i;
        add(ans, pos - 1, x++);
        // for(ll x : ans) cout << x << '\n';
    }
    return ans;
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...