Submission #1346211

#TimeUsernameProblemLanguageResultExecution timeMemory
1346211nagorn_phPermutation (APIO22_perm)C++20
91.33 / 100
1 ms344 KiB
#include "perm.h"
#include <bits/stdc++.h>
#define int long long
#define emb emplace_back
#define pii pair <int32_t, int32_t>
#define tiii tuple <int32_t, int32_t, int32_t>
#define all(a) a.begin(), a.end()

using namespace std;

const int N = 1e5 + 5;
const int inf = 1e18;

vector<int32_t> construct_permutation(long long k){
    // return {4, 0, 3, 1, 2};
	vector <int> val(65);
    int mul = 1;
    for (int i = 0; i <= 60; i++) {
        val[i] = mul;
        mul *= 2;
    }
    vector <int> need;
    for (int i = 60; i >= 0; i--) {
        while (k >= val[i]) {
            // cout << "UPDATE : " << k << "\n";
            k -= val[i], need.emb(i);
        }
    }
    vector <int32_t> ans;
    int x = 1;
    // cout << "NEED : ";
    // for (auto e : need) cout << e << " ";
    // cout << "\n";
    while (x <= need[0]) ans.emb(x++);
    while (ans.size() <= 300) ans.emb(-1);
    for (int i = 1; i < need.size(); i++) {
        auto e = need[i];
        // cout << e << " : ";
        bool change = 0;
        for (int j = 299; j >= 0; j--) {
            if (ans[j] == e) {
                ans[j + 1] = x++;
                change = 1;
                // cout << j;
                break;
            }
            else ans[j + 1] = ans[j];
        }
        if (!change) ans[0] = x++;
        // cout << "\n";
    }
    vector <int32_t> realans;
    for (auto e : ans) {
        if (e == -1) break;
        realans.emb(e - 1);
    }
    // cout << "ANS : ";
    // for (auto e : realans) cout << e << " "; cout << "\n";
    return realans;
}

/*
1: {}
2: {1}
3: {1, 0}
4: {0, 1}
5: 2^2 + 2^0 : {2, 0, 1}
6: 5: find xi such that sum(2^xi - 1) = 5 -> 2^2-1 + 2^1-1 + 2^1-1 = {2, 3, 1, 0}
4 0 3 1 2
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...