Submission #1201737

#TimeUsernameProblemLanguageResultExecution timeMemory
1201737adiyerPermutation (APIO22_perm)C++20
92.33 / 100
11 ms328 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){
    ll x = 0, s = 0, y = 1;
    vector < int > ans;
    vector < int > fac = {3, 2}; 
    while(1){
        ll f = fac[s];
        y *= f, s = (s + 1) % fac.size();
        if(y > k) break;
        if(f == 3){
            for(ll i = f - 2; i >= 0; i--) ans.push_back(x + i);
            x += f - 1;
        }
    }
    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){
                pos = i;
                sum += dp[i];
            }
        }
        add(ans, pos, x++);
    }
    return ans;
}

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