Submission #970479

# Submission time Handle Problem Language Result Execution time Memory
970479 2024-04-26T15:22:51 Z steveonalex Permutation (APIO22_perm) C++17
100 / 100
63 ms 716 KB
#include <bits/stdc++.h>
#include "perm.h"
 
using namespace std;
 
typedef long long ll;
typedef unsigned long long ull;
 
#define ALL(v) (v).begin(), (v).end()
#define MASK(i) (1LL << (i))
#define GETBIT(mask, i) (((mask) >> (i)) & 1)
 
// mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
mt19937_64 rng(1);
ll rngesus(ll l, ll r){return ((ull) rng()) % (r - l + 1) + l;}
 
ll max(ll a, ll b){return (a > b) ? a : b;}
ll min(ll a, ll b){return (a < b) ? a : b;}
 
ll LASTBIT(ll mask){return mask & (-mask);}
ll pop_cnt(ll mask){return __builtin_popcountll(mask);}
ll ctz(ll mask){return __builtin_ctzll(mask);}
ll clz(ll mask){return __builtin_clzll(mask);}
ll logOf(ll mask){return 63 - clz(mask);}
 
template <class T1, class T2>
    bool minimize(T1 &a, T2 b){
        if (a > b){a = b; return true;}
        return false;
    }
template <class T1, class T2>
    bool maximize(T1 &a, T2 b){
        if (a < b){a = b; return true;}
        return false;
    }
template <class T>
    void printArr(T& a, string separator = " ", string finish = "\n", ostream& out = cout){
        for(auto i: a) out << i << separator;
        out << finish;
    }
template <class T>
    void remove_dup(vector<T> &a){
        sort(ALL(a));
        a.resize(unique(ALL(a)) - a.begin());
    }

struct FenwickTree{
    int n;
    vector<ll> a;

    FenwickTree(int _n){
        n = _n;
        a.resize(n + 1);
    }

    void update(int i, ll v){
        while(i <= n){
            a[i] += v;
            i += LASTBIT(i);
        }
    }

    ll get(int i){
        ll ans = 0;
        while(i > 0){
            ans += a[i];
            i -= LASTBIT(i);
        }
        return ans;
    }
};

ll count_i(vector<int> perm){
    int n = perm.size();
    perm.insert(perm.begin(), -1);
    vector<ll> dp(n+1); dp[0] = 1;
    FenwickTree bit(n+2); bit.update(1, 1);
    ll sum = 1;
    for(int i = 1; i<=n; ++i){
        dp[i] = bit.get(perm[i] + 2);
        bit.update(perm[i] + 2, dp[i]);
        sum += dp[i];
    }
    return sum;
}


vector<int> construct_permutation(ll k){
    int j = 0;
    for(; k >= MASK(j + 1); ++j) ;
    j--;     
    vector<int> ans;
    for(int i = 0; i<=j; ++i) ans.push_back(i);

    ll cur = MASK(j+1);
    while(cur < k){
        ll start = cur;

        vector<int> best_config;
        int l = 0, r = ans.size();

        int n = ans.size();

        FenwickTree pref(n+1);
        pref.update(1, 1);
        for(int j = l; j <= r; ++j) {// inserted position
            FenwickTree suff(n+1); suff.update(n+1, 1);
            ll sum = 1;
            for(int i = r-1; i >= j; --i){
                ll mmb = sum - suff.get(ans[i]+1);
                suff.update(ans[i] + 1, mmb);
                sum += mmb;
            }

            for(int i = l; i <= r; ++i)  { // inserted value
                ll cnt = start + pref.get(i + 1) * (sum - suff.get(i));
                if (cnt <= k && maximize(cur, cnt)) {

                    vector<int> bruh = ans;
                    for(int &t: bruh) if (t >= i) t++;
                    bruh.insert(bruh.begin() + j, i);
                    best_config = bruh;
                }
            }
            if (j < r) pref.update(ans[j] + 2, pref.get(ans[j] + 2));
        }
        ans = best_config;
    }

    return ans;
}

// int main(void){
//     ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

//     // for(int i = 2; i<=100; ++i){
//     //     vector<int> perm = construct_permutation(i);
//     //     if (count_i(perm) != i){
//     //         cout << i << " " << count_i(perm) << "\n";
//     //         printArr(perm);
//     //         break;
//     //     }
//     // }

//     // clock_t start = clock();

//     // for(int i = 0; i<100; ++i){
//     //     vector<int> perm = construct_permutation(rngesus(5e17, 1e18));
//     //     cout << perm.size() << endl;
//     // }

//     // cout << "Time elapsed: " << clock() - start << "ms\n";

//     return 0;
// }
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 2 ms 348 KB Output is correct
4 Correct 3 ms 460 KB Output is correct
5 Correct 16 ms 348 KB Output is correct
6 Correct 16 ms 344 KB Output is correct
7 Correct 31 ms 604 KB Output is correct
8 Correct 48 ms 460 KB Output is correct
9 Correct 9 ms 348 KB Output is correct
10 Correct 63 ms 716 KB Output is correct
11 Correct 46 ms 344 KB Output is correct
12 Correct 39 ms 344 KB Output is correct
13 Correct 47 ms 452 KB Output is correct