Submission #1201723

#TimeUsernameProblemLanguageResultExecution timeMemory
1201723adiyerPermutation (APIO22_perm)C++20
92.33 / 100
8 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, f = 2;
    vector < int > ans;
    while(1){
        if(s) f = 3;
        else f = 2;
        if(y * f > k) break;
        s ^= 1; 
        if(f == 3) ans.push_back(x + 1);
        ans.push_back(x), x++;
        if(f == 3) x++;
        y *= f;
    }
    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...